Trong nhiều năm, kẻ giết người OOM trong hệ điều hành của tôi không hoạt động đúng và dẫn đến một hệ thống bị đóng băng.
Khi mức sử dụng bộ nhớ rất cao, toàn bộ hệ thống có xu hướng "đóng băng" (thực tế: trở nên cực kỳ chậm) trong nhiều giờ hoặc thậm chí nhiều ngày , thay vì giết các quá trình để giải phóng bộ nhớ.
Tối đa mà tôi đã ghi lại là 7 ngày trước khi từ chức để thực hiện thiết lập lại.
Khi OOM sắp đạt được, iowait rất rất cao (~ 70%), trước khi trở nên không thể đo lường được.
Công cụ: iotop
đã chỉ ra rằng mọi chương trình đều đọc với thông lượng rất cao (trên mỗi chục MB / giây) từ ổ cứng của tôi.
Những chương trình đó đang đọc gì?
- Hệ thống phân cấp thư mục?
- Bản thân mã thực thi?
Tôi không chính xác bây giờ.
[đã chỉnh sửa] Vào thời điểm tôi viết tin nhắn này (năm 2017), tôi đang sử dụng một ArchLinux mới nổi (4.9.27-1-lts), nhưng đã gặp vấn đề này trong nhiều năm trước.
Tôi đã gặp vấn đề tương tự với các bản phân phối Linux khác nhau và các cấu hình phần cứng khác nhau.
Hiện tại (2019), tôi đang sử dụng Debian 9.6 (4.9.0) nâng cấp Tôi có 16 GB ram vật lý, ổ SSD được cài đặt hệ điều hành của tôi và không có bất kỳ phân vùng trao đổi nào .
Vì số lượng ram mà tôi có, tôi không muốn kích hoạt phân vùng trao đổi, vì nó sẽ chỉ trì hoãn sự xuất hiện của vấn đề.
Ngoài ra, với việc SSD đổi chỗ quá thường xuyên có khả năng làm giảm tuổi thọ của đĩa.
Nhân tiện, tôi đã thử và không có phân vùng trao đổi, nó đã chứng minh rằng chỉ trì hoãn sự xuất hiện của vấn đề, nhưng không phải là giải pháp.
Đối với tôi, vấn đề xảy ra là do Linux làm rơi dữ liệu cần thiết từ bộ nhớ cache , dẫn đến một hệ thống bị đóng băng vì nó phải đọc mọi thứ, mọi lúc từ ổ cứng.
Tôi thậm chí tự hỏi nếu Linux sẽ không bỏ các trang mã thực thi của các chương trình đang chạy, điều này sẽ giải thích tại sao các chương trình thường không đọc nhiều dữ liệu, lại hoạt động theo cách này trong tình huống này.
Tôi đã thử một vài điều với hy vọng sẽ khắc phục vấn đề này.
Một là đặt /proc/sys/vm/min_free_kbytes
thành 1000000
(1 GB).
Vì 1 GB này vẫn còn miễn phí, tôi nghĩ rằng bộ nhớ này sẽ được Linux dành riêng để lưu trữ dữ liệu quan trọng.
Nhưng nó đã không làm việc.
Ngoài ra, tôi nghĩ hữu ích để thêm rằng thậm chí nếu nó có thể âm thanh tuyệt vời về mặt lý thuyết, hạn chế kích thước của bộ nhớ ảo với kích thước của bộ nhớ vật lý, bằng cách định nghĩa /proc/sys/vm/overcommit_memory
để 2
không decently về mặt kỹ thuật có thể trong hoàn cảnh của tôi, bởi vì các loại ứng dụng mà tôi sử dụng, đòi hỏi nhiều bộ nhớ ảo hơn là chúng sử dụng hiệu quả vì một số lý do.
Theo tệp /proc/meminfo
, Commited_AS
giá trị thường cao hơn gấp đôi ram vật lý trên hệ thống của tôi (16 GB, Commited_AS thường> 32 GB).
Tôi đã gặp vấn đề này với /proc/sys/vm/overcommit_memory
giá trị mặc định của nó: 0
và trong một thời gian tôi đã xác định nó là : 1
, bởi vì tôi thích các chương trình bị giết bởi kẻ giết người OOM hơn là hành xử sai vì chúng không kiểm tra giá trị trả về malloc
khi phân bổ bị từ chối.
Khi tôi nói về vấn đề này trên IRC , tôi đã gặp những người dùng Linux khác gặp phải vấn đề rất giống nhau, vì vậy tôi đoán rằng rất nhiều người dùng lo ngại về vấn đề này.
Đối với tôi điều này là không thể chấp nhận được vì ngay cả Windows cũng xử lý tốt hơn với việc sử dụng bộ nhớ cao.
Nếu bạn cần thêm thông tin, có một gợi ý, xin vui lòng cho tôi biết.
Tài liệu:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/
Họ nói về nó:
Tại sao kẻ giết người hết bộ nhớ linux (OOM) không chạy tự động, mà hoạt động dựa trên sysrq-key?
Tại sao OOM-killer đôi khi không giết được lợn đất?
Tải trước OOM Killer
Có thể kích hoạt OOM-killer khi bị tráo đổi?
Làm thế nào để tránh độ trễ cao gần tình hình OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843
min_free_kbytes
không liên quan, nó không phải là dự trữ cho các trang được lưu trữ. AFAICT không có hệ thống vm nào cho phép lưu trữ bất kỳ bộ nhớ cụ thể nào cho các trang được lưu trong bộ nhớ cache, tức là giới hạn phân bổ MAP_ANONYMOUS :(.