OOM Killer funktioniert nicht?

41

Soweit ich weiß, sollte der Kernel Prozesse abbrechen, wenn das System fast keinen freien Speicher mehr hat, um Speicher wiederzugewinnen. Aber in meinem System passiert das überhaupt nicht.

Angenommen, ein einfaches Skript weist nur viel mehr Speicher zu als im System verfügbar ist (z. B. ein Array mit Millionen von Zeichenfolgen). Wenn ich ein Skript wie dieses (als normaler Benutzer) ausführe, wird nur der gesamte Speicher abgerufen, bis das System vollständig einfriert (nur SysRQ REISUB funktioniert).

Der seltsame Teil hier ist, dass, wenn der Computer einfriert, die Festplatten-LED aufleuchtet und so bleibt, bis der Computer neu gestartet wird, entweder wenn ich eine Swap-Partition installiert habe oder nicht!

Meine Fragen sind also:

  1. Ist dieses Verhalten normal? Es ist seltsam, dass eine Anwendung, die als normaler Benutzer ausgeführt wird, das System auf diese Weise zum Absturz bringen kann ...
  2. Gibt es eine Möglichkeit, Ubuntu dazu zu bringen, diese Anwendungen automatisch zu beenden, wenn sie zu viel (oder den meisten) Speicher haben?

Zusätzliche Information

  • Ubuntu 12.04.3
  • Kernel 3.5.0-44
  • RAM: ~ 3,7 GB von 4 GB (gemeinsam mit der Grafikkarte). *

    $ tail -n+1 /proc/sys/vm/overcommit_*
    ==> /proc/sys/vm/overcommit_memory <==
    0
    
    ==> /proc/sys/vm/overcommit_ratio <==
    50
    
    $ cat /proc/swaps
    Filename                Type        Size    Used    Priority
    /dev/dm-1                               partition   4194300 344696  -1
    
Salem
quelle
Ich bin mir nicht sicher, warum es nicht funktioniert. Versuchen Sie tail -n+1 /proc/sys/vm/overcommit_*, die Ausgabe hinzuzufügen. Siehe auch: Wie konfiguriere ich oom-killer
kiri
Also, was passiert mit Ihrem Swap Space? Können Sie eine vmstat-Ausgabe wie #vmstat 1 100 oder so etwas posten? und zeige uns auch cat / etc / fstab Was passieren soll, ist bei einer bestimmten Speicherauslastung, du solltest anfangen zu schreiben, um zu tauschen. Tötungsvorgänge sollten erst stattfinden, wenn der Speicher und der Auslagerungsspeicher "voll" sind.
J0H
Versuchen Sie auch #swapon -a
j0h
@ j0h Mit Swap scheint es gut zu funktionieren (nach einiger Zeit stürzte der Prozess mit so etwas ab Allocation failed). Aber ohne Swap friert der Computer einfach ein. Es soll so funktionieren (nur töten, wenn Swap verwendet wird)?
Salem
2
Mit SysRq können Sie auch OOM (SysRq + F iirc)
Lekensteyn

Antworten:

36

Aus der offiziellen /proc/sys/vm/*Dokumentation :

oom_kill_allocating_task

Dies aktiviert oder deaktiviert das Beenden der OOM-auslösenden Task in Situationen, in denen nicht genügend Arbeitsspeicher vorhanden ist.

Wenn dieser Wert auf Null gesetzt ist, durchsucht der OOM-Killer die gesamte Jobliste und wählt eine Aufgabe basierend auf den zu tötenden Heuristiken aus. Dies wählt normalerweise einen Rogue Memory-Hogging-Task aus, der beim Beenden eine große Menge an Speicher freigibt.

Wenn dies auf einen Wert ungleich Null festgelegt ist, bricht der OOM-Killer einfach die Task ab, die den Zustand "Nicht genügend Speicher" ausgelöst hat. Dies vermeidet den teuren Joblisten-Scan.

Wenn panic_on_oom ausgewählt ist, hat es Vorrang vor dem Wert, der in oom_kill_allocating_task verwendet wird.

Der Standardwert ist 0.

Um zusammenzufassen bei der Einstellung oom_kill_allocating_taskzu 1, anstatt das System zu scannen für Prozesse zu töten suchen, die eine teuere und langsame Aufgabe ist, wird der Kernel tötet nur den Prozess, der das System verursachten Speicher raus.

Nach meinen eigenen Erfahrungen hat der Kernel beim Auslösen eines OOM nicht mehr genügend "Stärke", um einen solchen Scan durchzuführen, was das System völlig unbrauchbar macht.

Es wäre auch offensichtlicher, nur die Aufgabe zu beenden, die das Problem verursacht hat, sodass ich nicht verstehe, warum dies 0standardmäßig festgelegt ist.

Zum Testen können Sie einfach in die richtige Pseudodatei schreiben, die /proc/sys/vm/beim nächsten Neustart wieder rückgängig gemacht wird:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

Für eine dauerhafte Korrektur schreiben Sie Folgendes in /etc/sysctl.confoder in eine neue Datei /etc/sysctl.d/mit einer .confErweiterung ( /etc/sysctl.d/local.confzum Beispiel):

vm.oom_kill_allocating_task = 1
Teresa und Junior
quelle
2
Wurde es in Ubuntu immer auf 0 gesetzt? Weil ich mich erinnere, dass es früher automatisch getötet wurde, aber seit einigen Versionen hat es aufgehört, dies zu tun.
Skerit
1
@skerit Das weiß ich nicht genau, aber es wurde in den Kerneln, die ich 2010 verwendet habe (Debian, Liquorix und GRML), auf 0 gesetzt.
Teresa e Junior
"Außerdem wäre es offensichtlicher, nur die Aufgabe zu beenden, die das Problem verursacht hat, und ich verstehe nicht, warum dies 0standardmäßig eingestellt ist." - weil der Prozess, der den Speicher angefordert hat, nicht unbedingt derjenige ist, der das Problem verursacht hat. Wenn Prozess A 99% des Systemspeichers beansprucht, aber Prozess B, der 0,9% verwendet, zufällig derjenige ist, der den OOM-Killer durch Pech auslöst, hat B das Problem nicht "verursacht" und es ergibt keinen Sinn kill B. Da dies die Regel ist, besteht die Gefahr, dass völlig unproblematische Prozesse mit geringem Arbeitsspeicher durch Zufall aufgrund der unkontrollierbaren Speichernutzung eines anderen Prozesses beendet werden.
Mark Amery
1
@MarkAmery Das eigentliche Problem ist, dass Linux, anstatt nur den benötigten Prozess zu beenden, wie ein Verzögerer in Trümmern gerät, selbst wenn vm.admin_reserve_kbyteses auf beispielsweise 128 MB erhöht wird . Die Einstellung vm.oom_kill_allocating_task = 1scheint das Problem zu lindern, löst es aber nicht wirklich (und Ubuntu befasst sich bereits standardmäßig mit Gabelbomben).
Teresa e Junior
1
Vielleicht elegantersudo sysctl -w vm.oom_kill_allocating_task=1
Pablo A
9

Update: Der Fehler ist behoben.

Teresas Antwort reicht aus, um das Problem zu umgehen, und ist gut.

Zusätzlich habe ich einen Fehlerbericht eingereicht , da dies definitiv ein fehlerhaftes Verhalten ist.

int_ua
quelle
Ich weiß nicht, warum du runtergestimmt wurdest, aber das klingt für mich auch nach einem Kernel-Bug. Ich habe heute einen großen Universitätsserver damit zum Absturz gebracht und einige Prozesse beendet, die wochenlang liefen ... Vielen Dank, dass Sie diesen Fehlerbericht eingereicht haben!
Shapecatcher
7
Könnte 2014 behoben worden sein, 2018 (und 18.04) unternimmt der OOM-Killer erneut nichts.
Skierit
0

Sie können earlyoom ausprobieren , einen OOM-Killer, der im Benutzerbereich arbeitet und versucht, den größten Prozess in einer OOM-Situation zu beenden.

qwr
quelle
-1

Zunächst empfehle ich das Update auf 13.10 (Neuinstallation, Daten sichern).

Wenn Sie nicht aktualisieren möchten, ändern Sie die Datei vm.swappiness auf 10. Wenn Sie Probleme mit Ihrem RAM haben, installieren Sie zRAM.

Brask
quelle
2
Ich war nicht derjenige, der Sie herabgestimmt hat, aber im Allgemeinen vm.swappinessschadet das Verringern mehr als es nützt, noch mehr auf Systemen, die unter Problemen mit wenig Arbeitsspeicher leiden.
Teresa e Junior
Nicht, wenn Sie den RAM zuerst komprimieren und dann eine viel langsamere Datenträgernutzung vermeiden, die dazu führen kann, dass Ihr Computer einfriert.
Brask
In der Theorie ist zRAM eine nette Sache, aber es ist CPU-hungrig und im Allgemeinen die Kosten nicht wert. Speicher ist in der Regel viel billiger als Strom. Auf einem Laptop, auf dem das Aufrüsten des Arbeitsspeichers teurer ist, ist die CPU-Auslastung meist unerwünscht.
Teresa e Junior
Was er verlangt, ist, ein stabileres zRAM-System zu haben und die Änderung der Auslagerungszeit wird dazu führen, dass sein System mehr CPU-Ressourcen verwendet. Ja, aber was er als atm begrenzt und fehlerbehaftet ansieht, ist der Speicher. Er möchte das Problem beheben, keine Theorie-Lektion Was passiert, wenn Sie zRAM installieren?
Brask
Aus seiner Frage geht hervor, dass er möglicherweise ein falsches Skript schreibt, das mehr isst, als es sollte (und das habe ich bereits selbst gemacht). In einer solchen Situation können Sie beobachten, wie das Skript in wenigen Sekunden Gigabyte RAM abruft, und zRAM wird nicht zur Rettung kommen, da das Skript niemals zufrieden genug sein wird.
Teresa e Junior