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:
- 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 ...
- 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
tail -n+1 /proc/sys/vm/overcommit_*
, die Ausgabe hinzuzufügen. Siehe auch: Wie konfiguriere ich oom-killerAllocation failed
). Aber ohne Swap friert der Computer einfach ein. Es soll so funktionieren (nur töten, wenn Swap verwendet wird)?Antworten:
Aus der offiziellen
/proc/sys/vm/*
Dokumentation :Um zusammenzufassen bei der Einstellung
oom_kill_allocating_task
zu1
, 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
0
standardmäß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:Für eine dauerhafte Korrektur schreiben Sie Folgendes in
/etc/sysctl.conf
oder in eine neue Datei/etc/sysctl.d/
mit einer.conf
Erweiterung (/etc/sysctl.d/local.conf
zum Beispiel):quelle
0
standardmäß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.vm.admin_reserve_kbytes
es auf beispielsweise 128 MB erhöht wird . Die Einstellungvm.oom_kill_allocating_task = 1
scheint das Problem zu lindern, löst es aber nicht wirklich (und Ubuntu befasst sich bereits standardmäßig mit Gabelbomben).sudo sysctl -w vm.oom_kill_allocating_task=1
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.
quelle
Sie können earlyoom ausprobieren , einen OOM-Killer, der im Benutzerbereich arbeitet und versucht, den größten Prozess in einer OOM-Situation zu beenden.
quelle
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.
quelle
vm.swappiness
schadet das Verringern mehr als es nützt, noch mehr auf Systemen, die unter Problemen mit wenig Arbeitsspeicher leiden.