Jak ponownie dać zęby zabójcy OOM?

12

Wcześniej przeklinałem OOM-Killera za to, że był zbyt agresywny i zabijał aplikacje, których używałem. Teraz, gdy okresowo obserwuję mój system przez 15 minut z powodu jakiegoś źle zachowanego programu, a następnie w końcu uciekam się do wyłączenia zasilania, ponieważ nie reaguje on na klawiaturę, zdaję sobie sprawę, że miałem go lepiej, niż sobie wyobrażałem wtedy.

Jak przywrócić zabójcę OOM do jego starych, krwiożerczych sposobów?

Avdi
źródło
1
Spójrz na programy powodujące problem i ogranicz ilość pamięci, którą mogą zassaćlimits.conf
LawrenceC

Odpowiedzi:

4

Zmniejszyłbym ilość dostępnej przestrzeni wymiany. Obecnie typowe instalacje próbują przydzielić tyle swapów, ile jest pamięci fizycznej (lub czasami dwa razy więcej). Problem polega na tym, że gdy coś idzie nie tak, system przechodzi w spiralę śmierci, próbując „przetasować” rzeczy z pamięci na dysk iz powrotem, i zaczyna robić tak dużo , że nie ma czasu na reakcję do danych wejściowych użytkownika.

W dobrych czasach całe procesy były zamieniane na dyski (iz powrotem), dlatego potrzebne były duże wymiany.

W nowoczesnych systemach pamięci wirtualnej pamięć jest zamieniana na bloki (a nie całe procesy), dzięki czemu można sobie radzić z mniejszymi zamianami. W twoim scenariuszu lepiej byłoby zabijać procesy, więc uruchamianie z mniejszą zamianą spowoduje, że OOM zacznie szybciej zabijać procesy (zamiast tego, że system spędza nadmierną ilość czasu na zamianie rzeczy na / z dysku).

Brian Stevens
źródło
Mam zerową zamianę, a mój system blokuje się przez ponad 20 minut, gdy mam nieskończoną pętlę javascript w chromie, niż wypycha tablicę lub coś takiego. Muszę OOMK, aby uruchomić, zanim mój system będzie bezużyteczny, a już nie tak długo.
JasonWoof,
0

Oto, co zadziałało dla mnie:

echo 1 > /proc/sys/vm/oom_kill_allocating_task

To tylko dla tego rozruchu. Możesz przetestować, uruchamiając następujące polecenie na karcie konsoli w inspektorze przeglądarki:

a = []; while (true) { a.push(1); }

Jeśli jesteś zadowolony z tego ustawienia, możesz ustawić domyślnie wszystkie przyszłe buty:

echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf
JasonWoof
źródło