Meine Anwendung wird als Hintergrundprozess unter Linux ausgeführt. Es wird derzeit über die Befehlszeile in einem Terminalfenster gestartet.
Kürzlich hat ein Benutzer die Anwendung für eine Weile ausgeführt und sie ist auf mysteriöse Weise gestorben. Der Text:
Getötet
war auf dem Terminal. Dies geschah zweimal. Ich habe gefragt, ob jemand an einem anderen Terminal den Befehl kill verwendet hat, um den Prozess abzubrechen. Nein.
Unter welchen Bedingungen würde Linux beschließen, meinen Prozess abzubrechen? Ich glaube, die Shell zeigte "getötet" an, weil der Prozess nach dem Empfang des Kill (9) -Signals gestorben ist. Wenn Linux das Kill-Signal gesendet hat, sollte sich irgendwo in einem Systemprotokoll eine Meldung befinden, die erklärt, warum es getötet wurde?
/var/log/messages
(3) Die Shell, unter der der Prozess ausgeführt wurde.Killed
waitpid(2)
/var/log/syslog
Antworten:
Wenn der Benutzer oder Sysadmin das Programm nicht beendet hat, hat der Kernel möglicherweise. Der Kernel würde einen Prozess nur unter außergewöhnlichen Umständen wie extremem Ressourcenmangel beenden (denken Sie an mem + Swap-Erschöpfung).
quelle
dmesg
diese Option , um das Kernel-Protokoll anzuzeigen: Hier finde ich meine Python-Prozesse, die vom Kernel aufgrund des extremen Verbrauchs an virtuellem Speicher beendet wurden.Versuchen:
Wobei
-B100
die Anzahl der Zeilen vor dem Kill angegeben ist.Lassen Sie -T unter Mac OS weg .
quelle
info egrep
: "egrep ist dasselbe wie grep -E. ... Direkter Aufruf, da entweder egrep oder fgrep veraltet sind"'killed process'
Sie es verwenden können,grep
anstattegrep
ohne weitere Änderungen. Für ein komplexeres Muster würden Sie das Ersetzen ändern, z . B.egrep -i -B100 'foo|ba[rz]'
durchgrep -E -i -B100 'foo|ba[rz]'
. Diese Fragen und Antworten enthalten weitere Einzelheiten.dmesg -T
zu verwenden, um lesbare Zeitstempel zu erhaltenDies sieht nach einem guten Artikel zu diesem Thema aus: Den OOM-Killer zähmen .
Der Kern ist , dass Linux overcommitsErinnerung. Wenn ein Prozess mehr Speicherplatz benötigt, gibt Linux ihm diesen Speicherplatz, auch wenn er von einem anderen Prozess beansprucht wird, unter der Annahme, dass niemand tatsächlich den gesamten von ihm angeforderten Speicher verwendet. Der Prozess verwendet ausschließlich den Speicher, den er zugewiesen hat, wenn er ihn tatsächlich verwendet, und nicht, wenn er danach fragt. Dies macht die Zuweisung schnell und ermöglicht es Ihnen möglicherweise, mehr Speicher zu "betrügen" und zuzuweisen, als Sie wirklich haben. Sobald Prozesse diesen Speicher verwenden, stellt Linux möglicherweise fest, dass die Zuweisung von nicht vorhandenem Speicher zu großzügig war, und muss einen Prozess abbrechen, um einige freizugeben. Der abzubrechende Prozess basiert auf einer Bewertung, die die Laufzeit (lang laufende Prozesse sind sicherer), die Speichernutzung (gierige Prozesse sind weniger sicher) und einige andere Faktoren berücksichtigt. einschließlich eines Werts, den Sie anpassen können, um die Wahrscheinlichkeit zu verringern, dass ein Prozess abgebrochen wird. Es ist alles im Artikel viel detaillierter beschrieben.
Bearbeiten: Und hier ist ein weiterer Artikel , der ziemlich gut erklärt, wie ein Prozess ausgewählt wird (kommentiert mit einigen Kernel-Codebeispielen). Das Tolle daran ist, dass es einige Kommentare zu den Gründen für die verschiedenen
badness()
Regeln enthält.quelle
Lassen Sie mich zunächst erklären, wann und warum OOMKiller aufgerufen wird.
Angenommen, Sie haben 512 RAM + 1 GB Swap-Speicher. Theoretisch hat Ihre CPU also Zugriff auf insgesamt 1,5 GB virtuellen Speicher.
Jetzt läuft seit einiger Zeit alles einwandfrei innerhalb von 1,5 GB Gesamtspeicher. Aber plötzlich (oder allmählich) verbraucht Ihr System immer mehr Speicher und erreicht zu einem Zeitpunkt etwa 95% des gesamten verwendeten Speichers.
Angenommen, ein Prozess hat vom Kernel einen großen Speicherplatz angefordert. Der Kernel überprüft den verfügbaren Speicher und stellt fest, dass Ihr Prozess auf keinen Fall mehr Speicher zuweisen kann. Es wird also versucht, Speicherplatz freizugeben, der OOMKiller ( http://linux-mm.org/OOM ) aufruft / aufruft .
OOMKiller hat einen eigenen Algorithmus, um den Rang für jeden Prozess zu ermitteln. In der Regel wird der Prozess, der mehr Speicher benötigt, zum Opfer, das getötet werden muss.
Wo finde ich Protokolle von OOMKiller?
Normalerweise im Verzeichnis / var / log. Entweder /var/log/kern.log oder / var / log / dmesg
Hoffe das wird dir helfen.
Einige typische Lösungen:
quelle
Dies ist der Linux Out of Memory Manager (OOM) . Ihr Prozess wurde aufgrund von " Schlechtigkeit " ausgewählt - einer Kombination aus Aktualität, Größe des Bewohners (nicht genutzter Speicher) und anderen Faktoren.
Sie sehen eine Nachricht wie:
quelle
Wie dwc und Adam Jaskiewicz festgestellt haben, ist der Schuldige wahrscheinlich der OOM Killer. Die nächste Frage lautet jedoch: Wie verhindere ich dies?
Es gibt verschiedene Möglichkeiten:
Ich fand (2) dank dieses Artikels besonders einfach zu implementieren .
quelle
Die PAM - Modul zu begrenzen Ressourcen verursachen genau die Ergebnisse , die Sie beschrieben: Mein Prozess starb auf mysteriöse Weise mit dem Text getötet auf dem Konsolenfenster. Keine Protokollausgabe, weder in syslog noch in kern.log . Mit dem Top- Programm konnte ich feststellen, dass mein Prozess genau nach einer Minute CPU-Auslastung beendet wird.
quelle
Ein Tool wie systemtap (oder ein Tracer) kann die Kernel-Signalübertragungslogik überwachen und Berichte erstellen. Beispiel: https://sourceware.org/systemtap/examples/process/sigmon.stp
Der Filterblock
if
in diesem Skript kann nach Geschmack angepasst oder entfernt werden, um den systemweiten Signalverkehr zu verfolgen. Die Ursachen können durch Sammeln von Backtraces weiter isoliert werden (fügen Sie einprint_backtrace()
und / oderprint_ubacktrace()
zur Sonde für den Kernel- bzw. den User-Space hinzu).quelle
In einer lsf-Umgebung (interaktiv oder auf andere Weise) werden die Prozesse beendet, wenn die Anwendung die Speicherauslastung über einen von den Administratoren in der Warteschlange festgelegten Schwellenwert oder die Ressourcenanforderung beim Senden an die Warteschlange hinaus überschreitet, damit andere Benutzer nicht einem potenziellen Opfer zum Opfer fallen Renn weg. Es wird nicht immer eine E-Mail gesendet, wenn dies der Fall ist, je nachdem, wie es eingerichtet ist.
Eine Lösung in diesem Fall besteht darin, eine Warteschlange mit größeren Ressourcen zu finden oder größere Ressourcenanforderungen in der Übermittlung zu definieren.
Möglicherweise möchten Sie auch überprüfen
man ulimit
Obwohl ich mich nicht daran erinnere,
ulimit
dassKilled
es eine Weile her ist, seit ich das brauchte.quelle
Wir hatten wiederkehrende Probleme unter Linux bei einem Kundenstandort (Red Hat, glaube ich), wobei OOMKiller (Out-of-Memory-Killer) sowohl unsere Hauptanwendung (dh den Grund, warum der Server existiert) als auch seine Datenbankprozesse tötete.
In jedem Fall entschied OOMKiller einfach, dass die Prozesse zu viele Ressourcen verbrauchten ... die Maschine würde nicht einmal aus Mangel an Ressourcen ausfallen. Weder die Anwendung noch ihre Datenbank haben Probleme mit Speicherlecks (oder anderen Ressourcenlecks).
Ich bin kein Linux-Experte, aber ich habe den Algorithmus zusammengestellt, um zu entscheiden, wann etwas getötet werden soll und was zu töten ist, ist komplex. Außerdem wurde mir gesagt (ich kann nicht über die Genauigkeit sprechen), dass OOMKiller in den Kernel eingebrannt ist und man es nicht einfach nicht ausführen kann.
quelle
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Erlaubnis verweigertecho 2 | sudo tee /proc/sys/vm/overcommit_memory
In meinem Fall geschah dies mit einem Laravel-Warteschlangenarbeiter. In den Systemprotokollen wurde kein Kill erwähnt, daher habe ich weiter nachgesehen und es stellte sich heraus, dass der Worker sich aufgrund eines Jobs, der das Speicherlimit (das standardmäßig auf 128 MB festgelegt ist) überschritten hat, im Grunde selbst getötet hat.
Ausführen des Warteschlangenarbeiters mit
--timeout=600
und--memory=1024
Behebung des Problems für mich.quelle
Der Benutzer hat die Möglichkeit, seine eigenen Programme mit kill oder Control + C zu beenden, aber ich habe den Eindruck, dass dies nicht der Fall ist und dass sich der Benutzer bei Ihnen beschwert hat.
root hat natürlich die Fähigkeit, Programme zu beenden, aber wenn jemand root auf Ihrem Computer hat und Sachen tötet, haben Sie größere Probleme.
Wenn Sie nicht der Systemadministrator sind, hat der Systemadministrator möglicherweise Kontingente für CPU, RAM, oder Festplattennutzung eingerichtet und Prozesse, die diese überschreiten, automatisch beendet.
Abgesehen von diesen Vermutungen bin ich mir ohne weitere Informationen über das Programm nicht sicher.
quelle
Ich bin in letzter Zeit auf dieses Problem gestoßen. Schließlich stellte ich fest, dass meine Prozesse unmittelbar nach dem automatischen Aufruf des Opensuse Zypper-Updates abgebrochen wurden. Das Deaktivieren des Zypper-Updates hat mein Problem gelöst.
quelle
Dieses Problem wurde durch Erhöhen der Swap-Größe behoben :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
quelle