Przycisk „Zabij największy proces”

14

Ten laptop ma dysk SSD i dlatego postanowiłem pominąć swap. Działa to dobrze w większości przypadków, ale czasami pamięć RAM staje się trochę krótsza, a komputer staje się bardzo powolny i ma tendencję do zawieszania się. Czy istnieje sposób na zaimplementowanie przycisku „zabij największy proces”, który trafia prosto do jądra na wypadek, gdyby wystarczająco szybko zauważyłem zamrażanie? Lub, ponieważ jest to komputer, heurystyka, gdy zacznie się zamrażać i kręcić sam największy proces, również byłaby w porządku.

Reactormonk
źródło
Czy masz na myśli polecenie „zabić największy proces”?
Ramesh
Linux ma to. To się nazywa zabójca OOM. Musisz jednak włączyć nadmierną pamięć (jest ona domyślnie włączona w większości dystrybucji).
Patrick,
@Patrick overcommit_memoryjest 0, overcommit_ratiojest 50.
Reactormonk

Odpowiedzi:

12

Z twojego komentarza wynika, że ​​system po prostu się zmienia.

Linux ma zabójcę OOM, który jest wywoływany, gdy system nadmiernie zajmuje swoją pamięć, a teraz skończył się.
Linux domyślnie wykonuje nadpisywanie pamięci, co w zasadzie oznacza, że ​​daje programom więcej pamięci niż system faktycznie ma. Robi to przy założeniu, że programy nie wykorzystają całej wymaganej pamięci. Jednak gdy w systemie zabraknie pamięci, powiedział już różnym działającym procesom, że mają one pamięć, więc nie można jej dłużej odmawiać. Zamiast tego wywołuje zabójcę OOM. Killer OOM zasadniczo znajduje proces, który zdaniem jądra złagodzi stan braku pamięci. Zwykle jest to tylko proces wykorzystujący najwięcej pamięci, ale algorytm jest w rzeczywistości znacznie bardziej złożony.

Ponieważ overcommit_memoryustawiłeś 0(tryb automatyczny), jądro wykonuje nadpisywanie pamięci. Z twojego wyjaśnionego zachowania wynika, że ​​system po prostu mocno się zmienia.

Stąd są 2 opcje.

Zmniejsz swap

W twoim systemie kończy się pamięć RAM, więc jądro zaczyna pchać rzeczy do zamiany. Jeśli w twoim systemie zabraknie wymiany, wywoła on zabójcę OOM. Ponieważ jednak pozostało wolne miejsce wymiany, tak się nie dzieje.

Twój oryginalny pomysł, ręcznie zabij proces.

Możesz ręcznie zabić proces, jeśli uważasz, że system zamienia się za bardzo i coś musi umrzeć. Można to zrobić za pomocą wyzwalaczy SysRq jądra.

Jądro ma coś, co nazywa „magicznym SysRq”. Jest to trochę funkcji, która każe jądrze wykonać jakąś operację awaryjną. Mogą to być na przykład „ponownie podłącz wszystkie woluminy tylko do odczytu”, „zsynchronizuj wszystkie systemy plików” lub „uruchom ponownie teraz”. Jedną z tych opcji jest również wywołanie zabójcy OOM.

Jeśli twoje jądro ma włączoną funkcję magicznego SysRq (opcja jądra CONFIG_MAGIC_SYSRQ), możesz to zrobić na dwa sposoby.

  1. Alt+ SysRq+ f
    Po prostu naciśnij te 3 klawisze na klawiaturze.
  2. echo f > /proc/sysrq-trigger
    Wykona to dokładnie to samo zadanie co metoda klawiatury, ale robi to programowo.

Możesz także całkowicie wyłączyć swap, i właśnie to robię na większości moich systemów i właśnie z tego powodu. Zamiana jest korzystna, ponieważ jądro zapobiegawczo wymienia dane, które nie są używane, pozwalając na użycie większej ilości pamięci RAM do buforowania. Prowadzi to jednak do tego wymuszonego problemu wymiany.

Osobiście uważam, że najlepszym rozwiązaniem jest jakaś opcja jądra do wywołania OOM Killer przy wymuszonej zamianie. Zasadniczo pozwól, aby zapobiegawcza zamiana działała, ale jeśli jądro jest zmuszone przenieść coś do zamiany, ponieważ brakuje Ci pamięci RAM, to wywołaj OOM Killer.
Niestety jest to tylko moje osobiste życzenie. Nie robi tego.

Patrick
źródło
Nie wiedziałem o OOM Killer. Myślałem o skrypcie, który stale monitoruje użycie pamięci za pomocą polecenia toplub, psa jeśli przekroczy on pewien próg, zabija ten proces za pomocą killpolecenia.
Ramesh
Nie używam żadnej wymiany.
Reactormonk
aby zobaczyć, który proces został zabity przez zabójcę oom:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana
@Tass Och, całkowicie przeszklony nad komentarzem „Postanowiłem pominąć zamianę”, przepraszam :-(. Chociaż informacja o „ręcznym zabiciu procesu” nadal obowiązuje. Jednak nie powinieneś odczuwać powolności, gdy kończy się pamięć. powinien doświadczyć jądra, które po prostu zabija rzeczy
Patrick
@ Patryk to się zdarza, ale po ~ 30 minutach.
Reactormonk