Wir alle haben es erlebt - ein Programm muss etwas tun, das sehr viel Speicher benötigt. Es versucht pflichtbewusst, all diesen Speicher zuzuweisen, und das System beginnt sofort zu zermürben, endlos zu tauschen und träge oder nicht mehr reagierend zu werden.
Ich habe das zuletzt auf meinem Ubuntu-Laptop erlebt, weil ein Matlab-Skript versucht hat, eine lächerlich große Matrix zuzuweisen. Nach mehr als 5 Minuten Dreschen konnte ich Strg-F1 an eine Konsole drücken und Matlab töten. Ich hätte viel lieber einen Hotkey, der mir sofort die Kontrolle über das System gegeben hätte und mir erlaubt hätte, den störenden Prozess abzubrechen. oder vielleicht einfach stillschweigend die Zuweisung eines so großen Puffers verweigern.
Was ist der schnellste Weg, um die Kontrolle über ein Linux-System zurückzugewinnen, das aufgrund übermäßigen Austauschs nicht mehr reagiert oder extrem träge ist?
Gibt es einen wirksamen Weg, um ein solches Auslagern zu verhindern, indem beispielsweise die Speichermenge begrenzt wird, die ein Prozess zuzuteilen versucht?
Wurde oben bereits mit Alt-SysRq-F beantwortet
Ich beantworte diesen 2. Teil. Ja,
ulimit
funktioniert immer noch gut genug, um einen einzelnen Prozess einzuschränken. Sie können:Auch, wie kurz erwähnt:
Cgroups bieten zwar eine erweiterte Steuerung, sind aber meiner Meinung nach derzeit schwieriger zu konfigurieren.
Alte Schule ulimit
Einmalig
Hier ist ein einfaches Beispiel:
Es:
r2(){ r2 $@$@;};r2 r2
, der die CPU und den RAM exponentiell auslastet, indem er sich beim Anfordern des Stapelspeichers unendlich verdoppelt.Wie Sie sehen, wurde es angehalten, als versucht wurde, mehr als 1 GB anzufordern.
Beachten Sie, dass
-v
die Zuweisung von virtuellem Speicher (insgesamt, dh physisch + Swap) ausgeführt wird.Permanenter Schutz
Um die Zuweisung
as
des virtuellen Speichers zu begrenzen, ist dies das Äquivalent von-v
forlimits.conf
.Ich tue Folgendes, um mich vor einem einzelnen Fehlverhalten zu schützen:
address space limit = <physical memory> - 256MB
.Einzeiler:
Für die Validierung ergibt sich Folgendes (z. B. auf einem 16-GB-System):
Anmerkungen:
rss
Option in der limits.conf. Es wird von neueren Kerneln nicht respektiert.Neuere CGruppen
Bietet mehr Kontrolle, ist aber derzeit komplexer zu bedienen:
memory.max_usage_in_bytes
kann den physischen Speicher separat erfassen und begrenzen.ulimit -m
und / oderrss
inlimits.conf
eine ähnliche Funktionalität bieten, aber das funktioniert seit Kernel Linux 2.4.30 nicht mehr!cgroup_enable=memory swapaccount=1
.cgm
Jetzt scheint es sich um das offiziell unterstützte Userspace-Tool zu handeln.ZB um die aktuellen Einstellungen zu überprüfen:
ZB um den Speicher eines einzelnen Prozesses einzuschränken:
Um zu sehen, wie RAM als Hintergrundprozess gekaut und dann getötet wird, gehen Sie wie folgt vor:
Beachten Sie das exponentielle Wachstum (Potenz 2) der Speicheranforderungen.
Hoffen wir, dass in Zukunft "Distributoren / Lieferanten" Prioritäten und Limits für C-Gruppen (über System-Einheiten) für wichtige Dinge wie SSH und den Grafikstapel vorkonfigurieren, sodass ihnen nie der Speicher ausgeht.
quelle
Möglicherweise können Sie Ctrl- drücken z, um das Programm anzuhalten. Dann können Sie
kill %1
(oder wie auch immer die Auftragsnummer lautet oder Sie können die PID verwenden).Mit dem
ulimit
Befehl können Sie versuchen, den für einen Prozess verfügbaren Speicherplatz zu begrenzen.quelle
kill -STOP <pid>
was dasselbe bewirkt wie Strg-Z.Sie können CGroups verwenden, um die Ressourcennutzung einzuschränken und solche Probleme zu vermeiden: https://en.wikipedia.org/wiki/Cgroups
quelle
Es gibt immer den klassischen
xkill
Befehl (von xorg-x11-apps-7.4-14.fc14.src.rpm auf meinem System). Ich denke, es sollte nicht zu schwierig sein, einen Klon zu erstellen, der SIGSTOP sendet, anstatt das Zielfenster zu beenden.quelle