Wie stelle ich die OOM-Killereinstellungen für Daemons dauerhaft ein?

12

Auf einigen Linux-Servern werden einzelne oder nur einige wichtige Systemdienst-Daemons ausgeführt. Ich möchte den OOM-Killer für diese daemonisierten Prozesse anpassen, falls etwas Merkwürdiges passiert. Zum Beispiel heute einige Ubuntu - Server ausgeführt wird MySQL hat einen getötet MySQL - Daemon , weil Tonnen apt-checkerProzesse wurden alle Speicherraubend und der Kernel dachte , es war eine gute Idee MySQL zu töten.

Ich weiß, dass ich die Punktzahl mithilfe der /proc/$(pidof mysqld)/oom_score_adjDatei anpassen kann , um dem Kernel einen Hinweis zu geben. Ich bevorzuge nicht, dass MySQL beendet wird, aber das überlebt einen Neustart des Dienstes nicht. Sollte ich Init / Upstart-Skripte aus dem Paket bearbeiten, um diese Anpassungen einzuschließen? Ich denke nicht, dass das eine sehr elegante Lösung ist, da ich Anpassungen an Dateien vornehmen würde, die zu einem Paket gehören. Wäre es möglich, sich generell in Upstart / Init-Skripte einzumischen und diese bedingt anzupassen? Oder würden Sie vorschlagen, ein unbestimmtes Skript auszuführen wie while true{ adjust_oom(); sleep 60;}?

gertvdijk
quelle
Interessant, dass es die Möglichkeit gibt, das anzupassen. Ich vermute, es gibt nichts Besseres als Ihre Endlosschleife, um den Job zu erledigen. Der OOM-Killer steckt tief im Kernel und hat einen sehr undurchsichtigen Algorithmus.
Nils

Antworten:

7

Einige moderne Überwachungssysteme haben die Möglichkeit, dies zu tun. (Da es für diese Aufgabe ein Kettenladewerkzeug gibt, haben wohl alle ein Mittel, dies zu tun.)

  • Upstart: Verwenden Sie oom scorein der Auftragsdatei.
    oom score -500
  • systemd: Verwenden Sie die OOMScoreAdjust=Einstellung in der Wartungseinheit. Sie können Service-Unit-Patch-Dateien verwenden, um vorgefertigte Service-Units zu beeinflussen.
    [Service] 
    OOMScoreAdjust = -500
  • daemontools family : Verwenden Sie dasoom-kill-protectTool aus dem nosh-Toolset imrunProgramm für den Service.

    Wenn Sie eine convert-systemd-unitsSystemserviceeinheit konvertieren, konvertiert das Tool die OOMScoreAdjust=Einstellung in einen solchen Aufruf von oom-kill-protect.

    #! / bin / nosh 
    ...
    oom-kill-protect - -500
    ...
    Programm Argumente
    Als Bonus können Sie es parametrisierbar machen:
    oom-kill-protect - fromenv
    und setzen Sie den Wert des Parameters in der Umgebung des Dienstes (der aus einem dem Dienst zugeordneten envdir gelesen werden soll, hier manipuliert mit dem rcctlShim des nosh-Toolset ):
    rcctl setze Servicename oomprotect -500

Weitere Lektüre

  • Jonathan de Boyne Pollard (2016). oom-kill-protect. nosh toolset. Software.
  • James Hunt und Clint Byrum (2014). " oom score". Upstart-Kochbuch .
  • Lennart Poettering (07.10.2013). " OOMScoreAdjust". systemd.exec. systemd manpages. freedesktop.org.
  • Jonathan de Boyne Pollard. rcctl. nosh toolset. Software.
  • /unix//a/409454/5132
JdeBP
quelle
9

Dies ist in Ubuntu mit Upstart und der oom scoreKonfigurationsoption möglich.

oom score

Linux hat eine "Out of Memory" -Killer-Funktion. [...]

Normalerweise betrachtet der OOM-Killer alle Prozesse gleich, diese Zeilengruppe rät dem Kernel, diesen Job anders zu behandeln.

Der für diese Zeilengruppe bereitgestellte "Anpassungs" -Wert kann ein ganzzahliger Wert von -999 (der vom OOM-Killer höchstwahrscheinlich nicht getötet wird) bis 1000 (der vom OOM-Killer höchstwahrscheinlich getötet wird) sein. [...]

Beispiel:

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

expect daemon
respawn
exec /usr/bin/leaky-app
gertvdijk
quelle
Für Leser mit Ubuntu 16.04+ ist dies veraltet, da Upstart durch systemd ersetzt wurde.
Gertvdijk
4

Du könntest es in MySQL selbst hacken (zB OpenSSH sshdmacht das), aber das ist ein bisschen zu hardcore und sehr schmutzig (Probleme mit Updates etc.)

Sie können dies in einem Wrapper oder im Init-Skript tun - die Partitur sollte vererbt werden (und in einem Wrapper würden Sie wahrscheinlich exec mysqld "$@"sowieso tun wollen).

Verwendung cgroups- es gibt Ihnen ein bisschen mehr Flexibilität und es kann in dem Sinne dauerhaft gemacht werden, dass die entsprechenden Einstellungen automatisch beim Neustart des Dienstes angewendet werden können. Weitere Informationen finden Sie z. B. unter Steuern der Priorität von Anwendungen mithilfe von Gruppen . Um den gewünschten Automatismus zu erreichen, sollten Sie sich wahrscheinlich libcgroup ansehen , das einen Daemon enthält, der Änderungen an Gruppen von laufenden Prozessen im laufenden Betrieb gemäß einer Reihe von Regeln verarbeiten kann, oder einfach den cgexecWrapper verwenden ( aus dem gleichen Paket).

peterph
quelle