Từ nhận xét của bạn, có vẻ như hệ thống chỉ là trao đổi.
Linux có một trình diệt OOM, được gọi khi hệ thống đã quá tải bộ nhớ và hiện đã hết.
Linux theo mặc định thực hiện quá mức bộ nhớ, điều đó về cơ bản có nghĩa là nó cung cấp cho các chương trình nhiều bộ nhớ hơn so với hệ thống thực sự có. Nó thực hiện điều này với giả định rằng các chương trình sẽ không thực sự sử dụng tất cả bộ nhớ mà chúng yêu cầu. Tuy nhiên, khi hệ thống hết bộ nhớ, nó đã thông báo cho các quá trình đang chạy khác nhau rằng chúng có bộ nhớ, vì vậy nó không thể từ chối nữa. Thay vào đó, những gì nó làm là để gọi kẻ giết người OOM. Kẻ giết người OOM về cơ bản tìm thấy một quá trình mà hạt nhân nghĩ sẽ làm giảm bớt tình trạng hết bộ nhớ. Thông thường đây chỉ là quá trình sử dụng nhiều bộ nhớ nhất, nhưng thuật toán thực sự phức tạp hơn thế nhiều.
Vì bạn đã overcommit_memory
đặt thành 0
(chế độ tự động), kernel đang thực hiện bộ nhớ quá mức. Vì vậy, từ hành vi được giải thích của bạn, có vẻ như hệ thống đang trao đổi rất nhiều.
Từ đây có 2 lựa chọn.
Giảm trao đổi
Hệ thống của bạn sắp hết RAM và do đó, kernel bắt đầu đẩy mọi thứ vào trao đổi. Nếu hệ thống của bạn hết trao đổi, thì nó sẽ gọi kẻ giết người OOM. Tuy nhiên vì bạn vẫn còn không gian trao đổi miễn phí, điều này không xảy ra.
Ý tưởng ban đầu của bạn, thủ công giết một quá trình.
Bạn có thể tự hủy một quá trình khi bạn nghĩ rằng hệ thống đang hoán đổi quá nhiều và cần phải chết. Điều này có thể được thực hiện thông qua các kích hoạt SysRq kernel.
Hạt nhân có cái mà nó gọi là "ma thuật SysRq". Đây là một chút chức năng yêu cầu kernel thực hiện một số thao tác khẩn cấp. Đây có thể là những thứ như "kể lại tất cả các tập chỉ đọc", "đồng bộ hóa tất cả các hệ thống tập tin" hoặc "khởi động lại ngay bây giờ". Một trong những lựa chọn này cũng là để gọi kẻ giết người OOM.
Nếu kernel của bạn có phép thuật SysRq được bật (tùy chọn kernel CONFIG_MAGIC_SYSRQ
), bạn có thể làm điều này theo 2 cách.
- Alt+ SysRq+ f
Chỉ cần nhấn 3 phím này trên bàn phím.
echo f > /proc/sysrq-trigger
Điều này sẽ thực hiện nhiệm vụ chính xác giống như phương pháp bàn phím, nhưng thực hiện theo chương trình.
Bạn cũng có thể vô hiệu hóa trao đổi hoàn toàn và đây là những gì tôi làm trên hầu hết các hệ thống của mình và vì lý do chính xác này. Hoán đổi có lợi ở chỗ hạt nhân sẽ trao đổi trước dữ liệu không được sử dụng, cho phép sử dụng nhiều ram của bạn để lưu vào bộ đệm. Nhưng nó dẫn đến vấn đề hoán đổi bắt buộc này mà bạn đang thấy.
Cá nhân tôi nghĩ rằng giải pháp tốt nhất là một số loại tùy chọn kernel để gọi kẻ giết OOM khi bị tráo đổi. Về cơ bản hãy để trao đổi ưu tiên hoạt động, nhưng nếu hạt nhân buộc phải chuyển thứ gì đó sang trao đổi vì bạn hết RAM, thì hãy gọi kẻ giết OOM.
Thật không may, đây chỉ là mong muốn cá nhân của riêng tôi. Nó không làm điều này.