
Wenn ich in meine Shell eingebe x=`yes`
, erhalte ich irgendwann die Meldung cannot allocate 18446744071562067968 bytes (4295032832 bytes allocated)
, weil ewig yes
versucht wird, in zu schreiben, x
bis der Speicher voll ist. Ich erhalte eine Meldung, cannot allocate <memory>
weil der OOM-Killer des Kernels gemeldet hat, dass xrealloc
keine weiteren Bytes zum Zuweisen vorhanden sind und er sofort beendet werden soll.
Wenn ich jedoch jemanden auffordere, game_engine
mehr Grafikspeicher zuzuweisen, der nicht vorhanden ist, weil ich nicht über ausreichende Ressourcen verfüge, greift er auf meinen RAM und meine CPU zurück, um den angeforderten Speicher stattdessen dort zuzuweisen.
Warum erwischt der OOM-Killer des Kernels nie einen, game_engine
der versucht, Unmengen an Speicher zuzuordnen, wie dies bei der Fall ist x=`yes`
?
Das heißt, wenn ich es ausführe game_engine
und mein Benutzer seit dem Speicherfresser keine neuen Prozesse gestartet hat game_engine
, warum game_engine
gelingt es dann immer, mein System in die nicht mehr reagierenden, nicht mehr wiederherstellbaren Knie zu zwingen, ohne dass es durch OOM-Killer beendet wird?
Ich verwende Spiele-Engines als Beispiel, da diese dazu neigen, Tonnen und Tonnen an Speicher auf meiner armen kleinen integrierten Karte zu belegen, was jedoch bei vielen ressourcenintensiven X-Prozessen der Fall zu sein scheint.
Gibt es Fälle, in denen der OOM-Killer wirkungslos ist oder den Speicher eines Prozesses nicht widerrufen kann?
Antwort1
Die beste Lösung für den OOM-Killer ist wirklich, keinen zu haben. Konfigurieren Sie Ihr System so, dass es keinen überlasteten Speicher verwendet, und lehnen Sie die Verwendung von Anwendungen und Bibliotheken ab, die davon abhängen. Warum bieten Sie in Zeiten unbegrenzter Festplatten nicht unbegrenzten Swap an? Sie müssen sich nicht auf Swap festlegen, wenn der Speicher nicht verwendet wird, oder?
Die Antwort auf Ihre Frage könnte sein, dass der OOM-Killer nicht so funktioniert, wie Sie denken. Der OOM-Killer verwendet Heuristiken, um auszuwählen, welcher Prozess beendet werden soll, und die Regeln bedeuten nicht immer, dass der letzte Anforderer stirbt. Vgl.Den OOM-Killer zähmen. Es geht also nicht darum, dass der OOM-Killer „ineffektiv“ ist, sondern vielmehr darum, dass er eine andere Wahl trifft als die, die Sie bevorzugen würden.