Holen Sie sich einen Core-Dump / Debugging eines Prozesses, der von Oom-Killer getötet wurde

10

Gibt es eine Möglichkeit, einen Core-Dump zu erhalten oder einen Prozess zu debuggen, der von Oom-Killer getötet wurde?

Oder sogar Oom-Killer einstellen, um zu versuchen, einen Prozess stattdessen mit ABRT zu beenden?

TrapAlice
quelle

Antworten:

5

Ein anderer Ansatz besteht darin, die Überbelegung des Speichers zu deaktivieren.

So stellen Sie Ihrer Speicherverwaltung einen Anschein von Vernunft wieder her:

  1. Deaktivieren Sie den OOM Killer ( vm.oom-kill = 0in /etc/sysctl.conf einfügen)
  2. Deaktivieren Speicher overcommit (Put vm.overcommit_memory = 2in /etc/sysctl.conf)

Durch diese Einstellungen verhält sich Linux wie gewohnt (wenn ein Prozess mehr Speicher anfordert als verfügbar ist, malloc()schlägt dies fehl und der Prozess, der den Speicher anfordert, wird diesen Fehler voraussichtlich bewältigen).

Beachten Sie, dass dies ein ternärer Wert ist:
  • 0 = "Schätzung, ob wir genug RAM haben"
  • 1 = "Sag immer ja"
  • 2 = "Sag nein, wenn wir nicht das Gedächtnis haben"

Dadurch wird die Anwendung gezwungen, den Speichermangel selbst zu verarbeiten, und möglicherweise können die Protokolle / Coredump / usw. Ihnen etwas Nützliches geben.

UPDATE # 1

HINWEIS: Wenn Ihr System nicht mehr über genügend Speicher verfügt, können Sie keine neuen Prozesse erzeugen! Möglicherweise sind Sie vom System ausgeschlossen.

nishantjr
quelle
Das ist eine schreckliche Idee. Die meiste Software, die auf Ihrem System ausgeführt wird, behandelt den Rückgabewert aufgrund eines Speicherzuordnungsfehlers wahrscheinlich nicht richtig. Wenn Sie dies tun, werden Codepfade ausgeführt, die praktisch nie von jemandem ausgeführt werden, und im schlimmsten Fall können sogar Sicherheitslücken auf Ihrem System entstehen, wenn diese nicht getesteten und unerwarteten Codepfade ausgeführt werden.
KJ Tsanaktsidis
4
echo 1 > /proc/sys/vm/oom_dump_tasks

Dies scheint ungefähr das Maximum zu sein, mit dem der Kernel bei Fehlern aufgrund von Speichermangel angezeigt werden kann.

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Ermöglicht die Erstellung eines systemweiten Task-Dumps (ohne Kernel-Threads), wenn der Kernel ein OOM-Killing ausführt und Informationen wie pid, uid, tgid, VM-Größe, rss, nr_ptes, swapents, oom_score_adj score und name enthält. Dies ist hilfreich, um festzustellen, warum der OOM-Killer aufgerufen wurde, um die Schurkenaufgabe zu identifizieren, die ihn verursacht hat, und um festzustellen, warum der OOM-Killer die Aufgabe ausgewählt hat, die er zum Töten ausgeführt hat.

Wenn dies auf Null gesetzt ist, werden diese Informationen unterdrückt. Auf sehr großen Systemen mit Tausenden von Aufgaben ist es möglicherweise nicht möglich, die Speicherstatusinformationen für jede einzelne zu sichern. Solche Systeme sollten nicht gezwungen werden, unter OOM-Bedingungen eine Leistungsminderung zu erleiden, wenn die Informationen möglicherweise nicht erwünscht sind.

Wenn dies auf einen Wert ungleich Null gesetzt ist, werden diese Informationen immer dann angezeigt, wenn der OOM-Killer tatsächlich eine Memory-Hogging-Aufgabe beendet.

HBruijn
quelle