Wie verhindere ich, dass Linux einfriert, wenn der Speicher voll ist?

25

Heute habe ich (aus Versehen) ein Programm auf meiner Linux-Box ausgeführt, das schnell viel Speicher verbraucht hat. Mein System fror ein, reagierte nicht mehr und ich konnte den Täter nicht mehr töten.

Wie kann ich das in Zukunft verhindern? Kann es nicht zumindest einen reaktionsfähigen Kern oder etwas am Laufen halten?

johv
quelle
Duplikat des Systems hängt, wenn der Speicher
voll ist

Antworten:

15

Ich wette, das System hat nicht wirklich "eingefroren" (in dem Sinne, dass der Kernel hängen geblieben ist), sondern reagiert einfach nicht mehr. Wahrscheinlich war es nur ein starker Austausch, wodurch die interaktive Leistung und der Systemdurchsatz wie ein Stein fielen.

Sie könnten Swap deaktivieren, aber das ändert nur das Problem von schlechter Leistung zu OOM-gestörten Prozessen (und all dem Spaß, der dazu führt), zusammen mit der verringerten Leistung aufgrund des weniger verfügbaren Festplatten-Cache.

Alternativ können Sie Ressourcenbeschränkungen pro Prozess verwenden (im Allgemeinen als rlimitund / oder bezeichnet ulimit), um die Möglichkeit zu beseitigen, dass ein einzelner Prozess eine lächerliche Menge an Speicher beansprucht und ein Auslagern verursacht, was Sie jedoch nur dazu bringt, mit Prozessen, bei denen es zu kurz kommt, auf unterhaltsames Terrain zu kommen Unbequeme Momente, weil sie etwas mehr Speicher haben wollten, als das System ihnen geben wollte.

Wenn Sie wüssten, dass Sie etwas tun würden, das wahrscheinlich zu einer massiven Speichernutzung führen würde, könnten Sie wahrscheinlich ein Wrapper-Programm schreiben, das eine mlockall()Shell ausführt und dann ausführt. das würde es im Gedächtnis behalten und wäre die nächste Sache, um "einen reaktionsfähigen Kern zu behalten", die Sie wahrscheinlich bekommen werden (weil es nicht so ist, dass die CPU überlastet wird, das ist das Problem).

Persönlich abonniere ich die Methode der Ressourcensteuerung "Mach keine dummen Dinge". Wenn Sie Root sind, können Sie einem System alle Arten von Schaden zufügen, und alles , von dem Sie nicht wissen , ob es wahrscheinlich ist, dass es zu einem riskanten Geschäft führt.

womble
quelle
2
Leider hilft "Mach keine dummen Dinge" Benutzern nicht, die speicherintensive Anwendungen wie Chrome ausführen (siehe Probleme 134612 , 393395 ).
Dan Dascalescu
1
@DanDascalescu Und es ist nicht immer offensichtlich, dass du etwas Dummes tust. Mein Computer hat neulich aufgehängt, weil ich eine "UNION" in einer (komplizierten) SQLite-Abfrage in "UNION ALL" geändert habe.
Michael
Bekannte fehlerbehaftete Programme können (und sollten) in einer Konfiguration mit eingeschränkten Ressourcen ausgeführt werden - ulimitoder sogar Gruppen, die heutzutage ein hippes Kind sind, erledigen diese Aufgabe recht gut. Wenn Sie Änderungen an Abfragen in der Produktion vornehmen, ohne deren Auswirkungen in einer nicht kritischen Umgebung zu überprüfen, liegt das an Ihrer Ursache.
womble
8

Wie oben in Kommentar von Tronic erwähnt, ist es möglich, Call OOM-Killer (aus Memory - Killer) direkt durch die Tastenkombination SysRq- F.

SysRqDie Taste wird normalerweise innerhalb der PrtScTaste auf Tastaturen kombiniert .

OOM-Killer beendet einen Prozess (-es) und das System reagiert wieder. Der direkte Zugriff auf OOM-Killer ist möglicherweise nicht standardmäßig aktiviert. Überprüfen Sie diese Frage, um herauszufinden, wie Sie ihren Status überprüfen und / oder aktivieren können.

PS: Das hat mir sehr geholfen. Ich stimme der Meinung zu, dass dies der nützlichste Hinweis zu diesem Problem ist, wenn es von Chrome oder einer speichergierigen Software verursacht wird. Aber Sie müssen bedenken, dass OOM-Killer einen wirklich wichtigen Prozess zum Erliegen bringen kann. Gehen Sie vorsichtig damit um.

Arkemlar
quelle
1

Dies ist ein seit 2007 bekannter Fehler - siehe System friert bei hoher Speichernutzung ein .

In diesem Fall zeigt Windows ein Dialogfeld an, in dem der Benutzer aufgefordert wird, eine oder mehrere Anwendungen zu schließen.

Dan Dascalescu
quelle
0

Wenn Sie Lust haben, den Kernel neu zu kompilieren, können Sie den Patch aus dem EDITAbschnitt dieser Frage ausprobieren : https://stackoverflow.com/q/52067753/10239615
Er entfernt die Active(file)Seiten nicht bei hohem Speicherdruck und ermöglicht daher OOM-Killer Fast sofort auszulösen, da der Kernel nicht länger Minuten damit verbringen muss, die ausführbaren Codepages jedes Prozesses von der Festplatte neu zu lesen, was ein eingefrorenes Betriebssystem zur Folge hat.


quelle
-1

Dies ist besonders schwer zu verhindern. Es ist, weil der Kernel zu tauschen beginnt. Eine Lösung ist, Swap auszuschalten. Wenn auf dem System nicht mehr genügend Arbeitsspeicher zur Verfügung steht, bricht der Kernel einige Prozesse ab, anstatt mit dem Auslagern zu beginnen. In der Regel wird der richtige Prozess zum Beenden ausgewählt, aber es ist sowieso besser, einen zufälligen Prozess zu beenden, als ein nicht reagierendes System zu haben.

Dies kann eine besonders gute Lösung für Server sein, da Server oft genug RAM haben und wenn sie anfangen, Auslagerungsspeicher zu verwenden, bedeutet dies, dass sowieso etwas nicht stimmt. Desktops benötigen jedoch in der Regel den Swap-Speicherplatz. Daher gibt es meiner Meinung nach keine gute Lösung für Desktops. Ich schalte den Swap-Speicher in Servern oft aus, besonders wenn der Verdacht auf einen Speicherverlust besteht.

Antonis Christofides
quelle
4
Das Deaktivieren der Auslagerungsfunktion auf einem beliebigen System ist eine schlechte Idee, da nicht alle nicht verwendeten Seiten ausgelagert und der freie Speicherplatz für den Festplatten-Cache verwendet werden kann. Dies gilt insbesondere dann, wenn ein Speicherverlust vorliegt.
womble
2
Und bei ausgeschaltetem Swap kann das System aufgrund von Paging immer noch langsam werden. Es werden nur saubere Seiten ausgelagert, anstatt schmutzige. (Da es ohne Swap niemals eine schmutzige Seite räumen kann, muss es immer eine saubere Seite räumen.)
David Schwartz
Ich habe einen Server mit einem Speicherverlust. Beim ersten Mal musste ich die Reset-Taste drücken, da der Server nicht mehr reagierte. Aber jetzt, wo ich Swap ausgeschaltet habe, tötet der Server das Apache-Kind nur, wenn es zu groß wird (es ist ein Schutz zusätzlich zu MaxRequestsPerChild). Das Ergebnis ist, dass der Server problemlos läuft. Es gibt sowieso nicht viele unbenutzte Seiten, und es blättert auf keinen Fall verrückt nach sauberen Seiten.
Antonis Christofides
@AntonisChristofides: Ich bin mir nicht sicher, was du davon hältst. Ihre Lösung ist sicherlich eine schlechte, da sie die Leistung beeinträchtigt, da selten aufgerufene Dirty Pages nicht aus dem physischen Speicher entfernt werden können, das zugrunde liegende Problem nicht behoben wurde und Sie das Risiko eingehen, dass der OOM-Killer einen kritischen Prozess zum Erliegen bringt. Sie sind zufällig nicht auf die besondere Gefahr gestoßen, vor der ich gewarnt habe, aber Sie sind immer noch gefährdet, weil Sie keinen Swap haben.
David Schwartz
8
Mit oder ohne Swap friert es immer noch ein, bevor der OOM-Killer automatisch ausgeführt wird. Dies ist wirklich ein Kernel-Fehler, der behoben werden sollte (dh führen Sie den OOM-Killer früher aus, bevor Sie den gesamten Festplatten-Cache löschen). Leider können Kernel-Entwickler und viele andere Leute das Problem nicht erkennen. Häufige Vorschläge wie das Deaktivieren / Aktivieren des Austauschs, das Kaufen von mehr RAM, das Ausführen von weniger Prozessen, das Festlegen von Grenzwerten usw. lösen nicht das zugrunde liegende Problem, dass der Umgang mit wenig Arbeitsspeicher die Bälle des Kamels zum Kotzen bringt. In der Zwischenzeit empfehle ich, den OOM-Killer manuell auszuführen (SysRq-F), wenn das System einfriert, da es dadurch schneller wiederhergestellt wird.
Tronic