Odpowiedzi:
Innym podejściem jest wyłączenie nadmiernego zaangażowania pamięci.
Aby przywrócić odrobinę zdrowia psychicznego do zarządzania pamięcią:
- Wyłącz OOM Killer (
vm.oom-kill = 0
wstaw w /etc/sysctl.conf)- Wyłącz overcommitu pamięci (Put
vm.overcommit_memory = 2
w/etc/sysctl.conf
)Te ustawienia sprawią, że Linux będzie się zachowywał w tradycyjny sposób (jeśli proces zażąda więcej pamięci niż jest dostępna
Zauważ, że jest to wartość potrójna:malloc()
, zakończy się niepowodzeniem, a proces żądający pamięci poradzi sobie z tym niepowodzeniem).
- 0 = „oszacuj, czy mamy wystarczającą ilość pamięci RAM”
- 1 = „Zawsze mów tak”
- 2 = „powiedz nie, jeśli nie mamy pamięci”
Wymusi to, że aplikacja sama poradzi sobie z brakiem pamięci, a być może jej dzienniki / coredump / itp. Mogą dać ci coś pożytecznego.
UWAGA: Kiedy w twoim systemie zabraknie pamięci, nie będziesz w stanie odrodzić nowych procesów! Możesz zostać zablokowany w systemie.
echo 1 > /proc/sys/vm/oom_dump_tasks
co wydaje się maksymalne, że jądro może wyświetlać błędy braku pamięci.
https://www.kernel.org/doc/Documentation/sysctl/vm.txt
Umożliwia generowanie zrzutu zadań w całym systemie (z wyłączeniem wątków jądra), gdy jądro wykonuje zabijanie OOM i zawiera takie informacje, jak pid, uid, tgid, rozmiar vm, rss, nr_ptes, swapents, wynik oom_score_adj i nazwa. Pomaga to ustalić, dlaczego wywołano zabójcę OOM, zidentyfikować nieuczciwe zadanie, które go spowodowało, i ustalić, dlaczego zabójca OOM wybrał zadanie, które miał zabić.
Jeśli jest ustawiony na zero, informacje te są pomijane. W bardzo dużych systemach z tysiącami zadań zrzucenie informacji o stanie pamięci dla każdego z nich może być niewykonalne. Takie systemy nie powinny być zmuszane do ponoszenia kary wydajnościowej w warunkach OOM, gdy informacje mogą nie być pożądane.
Jeśli ta wartość jest ustawiona na niezerową, ta informacja jest wyświetlana za każdym razem, gdy zabójca OOM faktycznie zabija zadanie zapamiętywania pamięci.