Wyjaśniono tutaj, że OOM-Killer można skonfigurować za pomocą overcommit_memory
i że:
- 2 = bez nadmiernego zaangażowania. Przydziały kończą się niepowodzeniem, jeśli prosi się o zbyt wiele.
- 0, 1 = nadmierne zaangażowanie (heurystycznie lub zawsze). Zabij niektóre procesy oparte na heurystyce, gdy faktycznie uzyskuje się zbyt dużo pamięci.
Teraz mogę całkowicie to zrozumieć, ale dlaczego nie ma opcji (lub dlaczego nie jest to ustawienie domyślne) zabicia samego procesu, który faktycznie próbuje uzyskać dostęp do zbyt dużej ilości przydzielonej pamięci?
linux
out-of-memory
Martin Ba
źródło
źródło
no overcommit
opcja. Jeśli proces wymaga zbyt dużej ilości pamięci, kończy się niepowodzeniem. Jeśli sprawdzi błąd, zwykle sam się zabije; jeśli nie, prawdopodobnie pojawi się błąd segmentacji, gdy spróbuje wyłuskać zwracany wskaźnik zerowymalloc()
, i zawiesi się.no overcommit
tryb, zgodnie z cytowanymi źródłami (takimi jak kernel.org/doc/Documentation/vm/overcommit-accounting ). Myślę, że odpowiednio zmodyfikuję twoje pytanie.Odpowiedzi:
Rozważ ten scenariusz:
Jeśli proces, który został zabity, był ostatnim procesem żądania pamięci, menedżer zadań zginie.
Lub:
Teraz twój serwer X zostaje zabity. Nie spowodowało problemu; było po prostu „w niewłaściwym miejscu w niewłaściwym czasie”. Był to pierwszy proces przydzielania większej ilości pamięci, gdy jej nie było, ale to nie był proces, który wykorzystywał całą pamięć na początek.
źródło