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.
14
overcommit_memory
jest0
,overcommit_ratio
jest50
.Odpowiedzi:
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_memory
ustawił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.Po prostu naciśnij te 3 klawisze na klawiaturze.
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.
źródło
top
lub,ps
a jeśli przekroczy on pewien próg, zabija ten proces za pomocąkill
polecenia.grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1