Wie verwende ich oom_score_adj?


24

Am 11.04 /proc/[pid]enthält oom_score_adj, aber man procbeschreibt die alte oom_adj. Ich habe erfolglos nach Informationen gegoogelt, wie man das benutzt.

Ich muss dafür sorgen, dass Prozesse, die mit 'pbs' oder 'gridengine' gestartet wurden, beendet werden, bevor etwas anderes beendet wird. Wie kann ich das machen?


Damit diese Änderung für von Upstart verwaltete Dienste dauerhaft wirksam wird : Wie werden die OOM-Killer-Anpassungen für Daemons dauerhaft festgelegt? .
gertvdijk

Es ist schon eine Antwort. Es verbindet sich damit. :)
gertvdijk

Aber nicht auf dieser Seite :-)
bmargulies 31.01.13

Antworten:


13

Basierend auf meinen eigenen Fragen und Antworten zu Unix und Linux zu einer ähnlichen Frage.

Wie Stuart in seiner Antwort sehr gut hervorhob , sind gültige Werte Ganzzahlen im Bereich von -1000 bis 1000 für oom_score_adj. Je niedriger der Wert, desto geringer ist die Wahrscheinlichkeit, dass er getötet wird.

Es ist sehr unpraktisch, diesen Wert nach dem Neustart der Anwendung immer wieder ändern zu müssen. Die Informationen gehen einfach verloren, nachdem der Prozess beendet wurde. Upstart (der Init-Daemon in Ubuntu) hat eine nette Option, um Daemons zu konfigurieren, um sicherzustellen, dass sie gesetzt sind, wann immer sie (neu) gestartet wurden:

oom score

[...] schnipsen [...]

Beispiel:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Im Grunde genommen können Sie die /etc/init/myservice.confKonfigurationsdatei für die Dienste, die Sie ändern möchten, so bearbeiten , dass sie eine Zeile enthält oom score -1000. Ich gehe davon aus, dass die Services 'pbs' oder 'gridengine', von denen Sie in Ihrer Frage sprechen, Upstart-fähig sind. Andernfalls benötigen Sie einen anderen Weg, um dies dauerhaft zu ändern.


7

Wenn Sie das Startskript ändern können, das den Prozess erzeugt, den Sie für oom-killer priorisieren möchten, fügen Sie dem Startskript Folgendes hinzu:

echo 1000 > /proc/self/oom_score_adj

Der Wert wird für untergeordnete Prozesse vererbt.


6

Wenn Sie einen hohen (ish) Wert für oom_adj oder oom_score_adj festlegen, werden diese zuerst getötet. z.B

echo 15 > /proc/[pid]/oom_adj

oom_adj reicht von -16 bis 15 und wie oben erwähnt akzeptiert oom_score_adj -1000 bis 1000


Sie müssen root sein, um dies zu tun. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil

2
Tatsächlich können Sie die Punktzahl für Ihre Prozesse ohne Root erhöhen ("Ja, dies kann zum Scheitern verurteilt sein"). Abnehmend (unter 0) benötigt root.
Piskvor

5

Ein Blick in den Code ist immer eine gute Idee. Normalerweise benutze ich die Suchfunktion von kernel.org, aber es ist momentan nicht verfügbar. Github macht auch einen guten Job. Ich habe das gefunden:

Stattdessen wird eine neue abstimmbare Datei / proc / pid / oom_score_adj hinzugefügt, die von -1000 bis +1000 reicht. Es kann verwendet werden, um die Heuristik so zu polarisieren, dass bestimmte Aufgaben niemals für den OOM-Kill in Betracht gezogen werden, während andere immer in Betracht gezogen werden. Der Wert wird direkt zur Bewertung von badness () addiert. Ein Wert von -500 bedeutet beispielsweise, dass 50% des Speicherverbrauchs im Vergleich zu anderen Aufgaben im System, die an die Richtlinie gebunden sind, im cpuset oder abgezogen werden Freigabe des gleichen Speichercontrollers.

Von https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h


Vielen Dank für den Zeiger, aber ich hoffe, dass jemand vorbeifährt und ein Rezept für das gesamte Problem einarbeitet, das anscheinend dafür sorgt, dass dieser Wert für den exec-Dämon von pbs festgelegt wird, bevor Jobs abgefragt werden.
bmargulies

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.