Có thể kích hoạt OOM-killer khi buộc phải tráo đổi?


26

Có thể yêu cầu hệ thống hoán đổi các trang không hoạt động ( vm.swappiness), nhưng gọi kẻ giết người khi hệ thống hết RAM (thay vì hết bộ nhớ) và buộc phải trao đổi?

Mục đích cuối cùng là giữ cho hệ thống không bị ngừng hoạt động khi nó bắt đầu đập đĩa vì lỗi trang lớn, nhưng vẫn để các trang không hoạt động bị tráo đổi.

Một mong muốn khác là cấu hình bộ nhớ trao đổi mà hệ thống buộc phải sử dụng trước khi kích hoạt oom-killer. Bằng cách này, hệ thống có thể nhúng vào trao đổi chỉ một chút, miễn là nó không đi quá xa. Hoặc tôi có thể đặt ngưỡng như vậy để kích hoạt oom-killer trước khi sử dụng tất cả RAM để luôn có chỗ cho bộ đệm của hệ thống tệp (và do đó tránh được việc đập đĩa nhiều hơn).

Có vẻ như điều này sẽ khó thực hiện. Có vẻ như bạn chỉ cần nói với kẻ giết người kích hoạt khi hệ thống có X ram được sử dụng / miễn phí. Nhưng đây là lý do tại sao tôi hỏi; Tôi không biết.

Để làm rõ, tôi không tìm cách tắt trao đổi hoặc điều chỉnh vm.swappinesstham số


3
Thật thú vị, nó xảy ra ngay cả khi không có tập tin trao đổi. Rõ ràng, thay vào đó, các tệp ánh xạ bộ nhớ chỉ đọc (như tệp thực thi, thư viện, có lẽ là tài nguyên đồ họa) được thay thế.
WGH

Facebook oomd là một trình nền không gian người dùng được thiết kế để tiêu diệt các quy trình dựa trên thông lượng hệ thống tổng thể (nghĩa là chỉ khi đập). Nhưng có vẻ khá phức tạp khi thiết lập cho máy tính để bàn / máy trạm (có thể không đặt các tác vụ trong các nhóm hoặc thùng chứa).
Jeffrey Bosboom

Câu trả lời:


22

Tôi cũng vật lộn với vấn đề đó. Tôi chỉ muốn hệ thống của mình phản hồi nhanh, bất kể là gì và tôi thích mất các quy trình hơn để chờ đợi một vài phút. Dường như không có cách nào để đạt được điều này bằng cách sử dụng kernel killer oom.

Tuy nhiên, trong không gian người dùng, chúng tôi có thể làm bất cứ điều gì chúng tôi muốn. Vì vậy, tôi đã viết Daemon OOM sớm ( https://github.com/rfjakob/earlyoom ) sẽ giết quá trình lớn nhất (bằng RSS) khi RAM khả dụng xuống dưới 10%.

Nếu không có máy chiếu sớm, thật dễ dàng để khóa máy của tôi (RAM 8GB) bằng cách bắt đầu http://www.unrealengine.com/html5/ một vài lần. Bây giờ, các tab trình duyệt có tội bị giết trước khi mọi thứ vượt quá tầm tay.


1
Cảm ơn, đó chính xác là những gì tôi đang tìm kiếm. Bây giờ tôi có thể tiếp tục chạy column -t -s,trên một số tệp csv lớn và earlyoomgiết nó khi không thể, trước khi nhận thấy bất kỳ phản hồi nào.
henfiber

4

Điều này nghe có vẻ như một giải pháp quá phức tạp. Tôi sẽ đề xuất (và tôi thực hiện điều này trên các máy tôi thiết lập không cần ngủ đông) chỉ cần phân bổ một lượng nhỏ không gian hoán đổi (128-256MiB). Bằng cách này, kernel có thể hoán đổi một số trang, nhưng OOM-killer được gọi trước khi mọi thứ trở nên tồi tệ.

Nếu bạn thực sự muốn làm điều này, tôi nghĩ rằng bạn sẽ cần phải viết kịch bản / chương trình của riêng mình để theo dõi việc sử dụng trao đổi và gọi OOM-killer bằng phím Magic SysReq (có thể được lập trình bằng cách viết /proc/sysrq-trigger).


1
Tôi sẽ lập luận rằng có một trao đổi nhỏ không phải là một giải pháp rất thanh lịch. Về cơ bản, bạn cuối cùng đã hạn chế tính hữu ích của trao đổi của bạn. Điều gì sẽ xảy ra nếu bạn có nhiều trang không hoạt động và sẽ được hưởng lợi từ việc có 10gb trao đổi xung quanh? Tôi có các hộp với ~ 100gb ram trong đó 10gb trao đổi không phải là một ý tưởng xa vời. Và việc viết một ứng dụng để làm điều này trong không gian người dùng chỉ là vấn đề (so với nguyên bản trong kernel).
Patrick

Bởi vì về cơ bản, bạn cần một cơ chế để phân biệt "hoán đổi tốt" với "hoán đổi xấu" và đó là một thuật toán khó để đưa ra. Lượng trao đổi phù hợp rõ ràng phụ thuộc vào dung lượng RAM và khối lượng công việc bạn đang chạy, vì vậy nếu 10GiB phù hợp với máy của bạn thì hãy phân bổ rằng :-)
mgorven

Tại sao điều đó sẽ khó khăn? Chỉ có 2 loại trao đổi, hoán đổi ưu tiên do vm.swappinessvà hoán đổi bắt buộc do hết ram. Tất cả những gì cần phải xảy ra là khi kernel buộc phải trao đổi, để kích hoạt oom-killer. Và 10gb cũng để lại hàng tấn không gian cho việc hoán đổi để đập đĩa.
Patrick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.