Ist es möglich, OOM-Killer beim erzwungenen Tauschen auszulösen?

26

Ist es möglich, dass das System präventiv inaktive Seiten auslagert ( vm.swappiness), aber den OOM-KILLER aufruft, wenn das System nicht über genügend RAM verfügt (im Gegensatz zu Speichermangel) und zum Auslagern gezwungen wird?

Das ultimative Ziel ist es, zu verhindern, dass das System zum Stillstand kommt, wenn die Festplatte aufgrund schwerwiegender Seitenfehler überlastet wird, aber inaktive Seiten dennoch ausgelagert werden.

Ein weiterer Wunsch wäre es, zu konfigurieren, wie viel Swap-Speicher das System verwenden muss, bevor der Tod auslöst. Auf diese Weise kann das System nur ein wenig in den Swap eintauchen, solange es nicht zu weit geht. Oder ich könnte einen solchen Schwellenwert festlegen, um oom-killer auszulösen, bevor der gesamte Arbeitsspeicher verwendet wird, sodass immer Platz für den Dateisystem-Cache vorhanden ist (und somit mehr Festplatten-Thrashing vermieden wird).

Es scheint nicht so schwer zu sein. Es sieht so aus, als könnten Sie dem Oom-Killer einfach sagen, dass er auslösen soll, wenn das System X-RAM verwendet / frei hat. Aber deshalb frage ich; Ich weiß es nicht.

Zur Verdeutlichung möchte ich Swap nicht ausschalten oder den vm.swappinessParameter anpassen

Patrick
quelle
3
Interessanterweise geschieht dies auch dann, wenn keine Auslagerungsdatei vorhanden ist. Anscheinend werden stattdessen schreibgeschützte Speicherdateien (wie ausführbare Dateien, Bibliotheken, möglicherweise Grafikressourcen) ausgelagert.
WGH
Facebooks oomd ist ein User-Space-Daemon, der darauf ausgelegt ist, Prozesse basierend auf dem Gesamtsystemdurchsatz (dh nur beim Thrashen) abzubrechen. Das Einrichten von Desktops / Workstations (die wahrscheinlich keine Aufgaben in Gruppen oder Containern ablegen) scheint jedoch ziemlich kompliziert zu sein.
Jeffrey Bosboom

Antworten:

22

Ich hatte auch Probleme damit. Ich möchte nur, dass mein System auf alle Fälle reagiert, und ich ziehe es vor, Prozesse zu verlieren, anstatt ein paar Minuten zu warten. Es scheint keine Möglichkeit zu geben, dies mit dem Kerneloom-Killer zu erreichen.

Im Benutzerbereich können wir jedoch tun, was wir wollen. Also habe ich den Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) geschrieben, der den größten Prozess (per RSS) beendet, sobald der verfügbare RAM unter 10% sinkt .

Ohne Earlyoom war es einfach, meinen Computer (8 GB RAM) durch mehrmaliges Starten von http://www.unrealengine.com/html5/ zu sperren . Jetzt werden die schuldigen Browser-Registerkarten gelöscht, bevor die Dinge außer Kontrolle geraten.

Jakob
quelle
1
Danke, genau das habe ich gesucht. Ich kann jetzt column -t -s,einige große CSV-Dateien weiter bearbeiten und sie beenden earlyoom, wenn dies nicht möglich ist, bevor ich eine Unreaktivität feststelle.
Henfiber
4

Das klingt nach einer zu aufwändigen Lösung. Ich würde vorschlagen (und ich mache dies auf Computern, die ich eingerichtet habe und die nicht in den Ruhezustand versetzt werden müssen), einfach eine kleine Menge Swap-Speicher (128-256 MB) zuzuweisen. Auf diese Weise kann der Kernel einige Seiten austauschen, aber der OOM-Killer wird aufgerufen, bevor die Dinge schlecht werden.

Wenn Sie dies wirklich tun möchten, müssen Sie wahrscheinlich Ihr eigenes Skript / Programm schreiben, das die Auslagerungsnutzung überwacht und den OOM-Killer mit dem Magic SysReq-Schlüssel aufruft (dies kann programmgesteuert durch Schreiben in erfolgen /proc/sysrq-trigger).

mgorven
quelle
1
Ich würde argumentieren, dass ein kleiner Swap keine sehr elegante Lösung ist. Grundsätzlich schränken Sie den Nutzen Ihres Swaps ein. Was ist, wenn Sie viele inaktive Seiten haben und davon profitieren würden, 10 GB umzutauschen? Ich habe Boxen mit ~ 100 GB RAM, in denen 10 GB Swap keine weit hergeholte Idee ist. Und das Schreiben einer Anwendung, um dies im Userspace zu tun, ist nur für Probleme offen (im Vergleich zum Kernel).
Patrick
Denn dann brauchen Sie im Wesentlichen einen Mechanismus, um "gutes Tauschen" von "schlechtem Tauschen" zu unterscheiden, und das ist ein schwierig zu entwickelnder Algorithmus. Die Menge an Swap, die angemessen ist, hängt natürlich von der Größe des Arbeitsspeichers und der Workload ab, die Sie ausführen. Wenn also 10 GB für Ihre Computer angemessen sind, teilen Sie Folgendes zu :-)
mgorven
Warum sollte das schwierig sein? Es gibt nur zwei Swap-Arten, den präventiven Swap aufgrund vm.swappinessund den erzwungenen Swap aufgrund fehlenden RAMs. Alles, was passieren muss, ist, wenn der Kernel zum Tauschen gezwungen wird, um oom-killer auszulösen. Und 10 GB lassen auch Tonnen von Speicherplatz für das erzwungene Austauschen, um die Festplatte zu zertrümmern.
Patrick