Czy można uruchomić OOM-Killera przy wymuszonej zamianie?

26

Czy jest możliwe, aby system zapobiegawczo wymieniał nieaktywne strony ( vm.swappiness), ale wywołuje funkcję Oom-Killer, gdy systemowi kończy się pamięć RAM (w przeciwieństwie do wyczerpywania pamięci) i jest zmuszony do zamiany?

Ostatecznym celem jest powstrzymanie systemu przed zatrzymaniem się, gdy zacznie psuć dysk z powodu poważnych błędów strony, ale nadal pozwoli na zamianę nieaktywnych stron.

Innym pragnieniem byłoby skonfigurowanie ilości pamięci wymiany, którą system jest zmuszony użyć przed uruchomieniem programu oom-killer. W ten sposób system może się trochę zamieniać, o ile nie posunie się za daleko. Lub mógłbym ustawić taki próg, aby uruchomić Oom-Killera przed użyciem całej pamięci RAM, aby zawsze było miejsce na pamięć podręczną systemu plików (a tym samym uniknąć większego dyskowania).

Nie wydaje się, żeby to było takie trudne. Wygląda na to, że możesz po prostu powiedzieć oom-killerowi, aby uruchomił się, gdy system używa X-ram używanego / wolnego. Ale dlatego pytam; Nie wiem

Dla wyjaśnienia nie chcę wyłączać wymiany ani dostosowywać vm.swappinessparametru

Patrick
źródło
3
Co ciekawe, dzieje się tak nawet wtedy, gdy nie ma pliku wymiany. Wydaje się, że zamiast tego zamieniane są tylko pliki mapowane tylko do odczytu (takie jak pliki wykonywalne, biblioteki, być może zasoby graficzne).
WGH
Oomd Facebooka jest demonem przestrzeni użytkownika zaprojektowanym do zabijania procesów w oparciu o ogólną przepustowość systemu (tj. Tylko podczas kruszenia). Ale ustawienie komputerów stacjonarnych / stacji roboczych wydaje się dość skomplikowane (które prawdopodobnie nie umieszczają zadań w grupach lub kontenerach).
Jeffrey Bosboom

Odpowiedzi:

22

Walczyłem również z tym problemem. Chcę tylko, aby mój system pozostał responsywny, bez względu na wszystko, i wolę tracić procesy niż czekać kilka minut. Wydaje się, że nie ma sposobu na osiągnięcie tego przy użyciu narzędzia do zabijania jądra.

Jednak w przestrzeni użytkownika możemy robić, co chcemy. Napisałem więc demona Early OOM ( https://github.com/rfjakob/earlyoom ), który zabije największy proces (przez RSS), gdy dostępna pamięć RAM spadnie poniżej 10%.

Bez wczesnej przerwy można łatwo zablokować maszynę (8 GB pamięci RAM), uruchamiając http://www.unrealengine.com/html5/ kilka razy. Teraz winne karty przeglądarki giną, zanim sprawy wymkną się spod kontroli.

Jakob
źródło
1
Dzięki, właśnie tego szukałem. Mogę teraz nadal uruchamiać column -t -s,niektóre ogromne pliki csv i pozwolić earlyoomzabijać je, gdy nie jest to możliwe, zanim zauważę brak reakcji.
henfiber
4

To brzmi jak zbyt skomplikowane rozwiązanie. Sugerowałbym (i robię to na maszynach, które konfiguruję, które nie wymagają hibernacji) po prostu przydzielając niewielką ilość przestrzeni wymiany (128-256 MB). W ten sposób jądro może zamieniać niektóre strony, ale OOM-killer jest wywoływany, zanim coś się pogorszy.

Jeśli naprawdę chcesz to zrobić, myślę, że musisz napisać własny skrypt / program, który monitoruje użycie wymiany i wywołuje OOM- killera za pomocą klucza Magic SysReq (co można zrobić programowo, pisząc do /proc/sysrq-trigger).

mgorven
źródło
1
Twierdziłbym, że mała zamiana nie jest bardzo eleganckim rozwiązaniem. Zasadniczo kończysz na ograniczeniu użyteczności zamiany. Co zrobić, jeśli masz dużo nieaktywnych stron i korzystasz z wymiany 10 GB? Mam pudełka z ~ 100 GB pamięci RAM, gdzie 10 GB wymiany nie jest dalekim pomysłem. A pisanie aplikacji do wykonywania tego w przestrzeni użytkownika jest po prostu otwarte na problemy (w porównaniu z natywną wersją jądra).
Patrick
Ponieważ wtedy zasadniczo potrzebujesz mechanizmu odróżniającego „dobrą wymianę” od „złej wymiany”, i jest to trudny algorytm do opracowania. Odpowiednia ilość zamiany zależy oczywiście od ilości pamięci RAM i obciążenia roboczego, więc jeśli 10GiB jest odpowiednie dla twoich komputerów, przydziel to :-)
mgorven
Dlaczego miałoby to być trudne? Istnieją tylko 2 rodzaje zamiany, zapobiegawcza zamiana z powodu vm.swappinessi wymuszona zamiana z powodu wyczerpania pamięci RAM. Wszystko, co musi się zdarzyć, to kiedy jądro jest zmuszone do zamiany, aby uruchomić Oom-Killera. 10 GB pozostawia również mnóstwo miejsca na wymuszoną zamianę dysku.
Patrick