Wie entscheidet der OOM-Killer, welcher Prozess zuerst beendet wird?

92

Diese Antwort erklärt die Aktionen, die der Kernel ausführt, wenn eine OOM-Situation auftritt, basierend auf dem Wert von sysctl vm.overcommit_memory.

Wenn overcommit_memoryauf 0 oder 1 gesetzt, overcommitist aktiviert, und Programme können mehr Speicher zuweisen, als tatsächlich verfügbar ist.

Was passiert nun, wenn uns in dieser Situation der Speicher ausgeht? Wie entscheidet der OOM-Killer , welcher Prozess zuerst beendet wird?

Ramesh
quelle
1
Ich glaube, dass die Werte 1 und 2 sind - nicht 0 und 1.
fpmurphy
Ab hier sind serverfault.com/questions/606185/… , 0 und 1 die richtigen Werte.
Rui F Ribeiro
1
Es gibt eine hervorragende Beschreibung unter linux-mm.org/OOM_Killer
Jarek Przygódzki
Laut kernel.org/doc/Documentation/vm/overcommit-accounting sind 0, 1 und 2 alles gültige Werte.
Derek Lewis

Antworten:

109

Wenn der Arbeitsspeicher von Prozessen in einem Ausmaß aufgebraucht wird, das möglicherweise die Stabilität des Systems gefährdet, kommt der OOM-Killer ins Spiel.

ANMERKUNG: Es ist die Aufgabe des OOM-Killers, die Prozesse so lange abzubrechen, bis genügend Speicher freigegeben ist, damit der Rest des Prozesses, den der Kernel auszuführen versucht, reibungslos funktioniert.

Der OOM-Killer muss die besten Prozesse zum Töten auswählen . Das Beste bezieht sich hier auf den Prozess, der beim Beenden den maximalen Speicher freigibt und der für das System am wenigsten wichtig ist.

Das Hauptziel besteht darin, die geringste Anzahl von Prozessen zu beenden, die den verursachten Schaden minimieren, und gleichzeitig die Menge des freigewordenen Speichers zu maximieren.

Um dies zu erleichtern, verwaltet der Kernel oom_scorefür jeden der Prozesse einen. Sie können die oom_scoreeinzelnen Prozesse im /procDateisystem unter dem pidVerzeichnis sehen.

$ cat /proc/10292/oom_score

Je höher der Wert eines oom_scoreProzesses ist, desto höher ist die Wahrscheinlichkeit, dass der OOM-Killer in einer Situation außerhalb des Arbeitsspeichers getötet wird.

Wie OOM_Scoreberechnet sich das?

In Davids Patch-Set sind die alten Badness () -Heuristiken fast vollständig verschwunden. Stattdessen wird die Berechnung zu einer einfachen Frage, wie viel Prozent des verfügbaren Speichers vom Prozess verwendet werden. Wenn das System insgesamt nicht genügend Arbeitsspeicher hat, ist "Verfügbarer Arbeitsspeicher" die Summe aller für das System verfügbaren RAM- und Auslagerungsspeicher.

Wenn die OOM-Situation stattdessen durch Erschöpfung des für eine bestimmte CPU-Gruppe / Kontrollgruppe zulässigen Speichers verursacht wird, ist "verfügbarer Speicher" die dieser Kontrollgruppe zugewiesene Gesamtmenge. Eine ähnliche Berechnung wird durchgeführt, wenn die durch eine Speicherrichtlinie auferlegten Grenzwerte überschritten wurden. In jedem Fall wird die Speichernutzung des Prozesses als die Summe seiner residenten Menge (der Anzahl der verwendeten RAM-Seiten) und seiner Auslagerungsnutzung angesehen.

Diese Berechnung ergibt eine Prozent-mal-Zehn-Zahl. Ein Prozess, der jedes Byte des ihm zur Verfügung stehenden Speichers verwendet, hat eine Punktzahl von 1000, während ein Prozess, der überhaupt keinen Speicher verwendet, eine Punktzahl von Null erhält. Es gibt nur sehr wenige heuristische Änderungen an dieser Bewertung, aber der Code subtrahiert immer noch einen kleinen Betrag (30) von der Bewertung von Prozessen, die sich im Stammbesitz befinden, und geht davon aus, dass sie etwas wertvoller sind als Prozesse, die sich im Besitz des Benutzers befinden.

Eine weitere Optimierung besteht darin, den in der Variablen oom_score_adj jedes Prozesses gespeicherten Wert hinzuzufügen, der über / proc angepasst werden kann. Mit diesem Knopf können Sie die Attraktivität jedes Prozesses für den OOM-Killer im Benutzerbereich einstellen. Wenn Sie den Wert auf -1000 setzen, werden OOM-Kills vollständig deaktiviert, während der Wert +1000 dem Zeichnen eines großen Ziels auf dem zugeordneten Prozess entspricht.

Verweise

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326

Ramesh
quelle
3
Spielt die Freundlichkeit nicht auch eine Rolle?
neverMind9