Debuggen Sie zu wenig Speicher mit / var / log / messages

42

Der folgende Bericht wird in meinem Nachrichtenprotokoll abgelegt:

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

Es spielt keine Rolle, ob dieses Problem vorliegt httpd, mysqldoder postfixich bin gespannt, wie ich das Problem weiterhin beheben kann.

Wie kann ich mehr Informationen darüber erhalten, warum die PID 9163 beendet wird und ich bin nicht sicher, ob Linux irgendwo einen Verlauf für die terminierten PIDs führt?

Wenn dies in Ihrer Nachrichtenprotokolldatei auftritt, wie können Sie dieses Problem schrittweise beheben?

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`
ibedelovski
quelle
In was werden alle Meldungen zum Problem angezeigt dmesg?
Stark07
Nützliche Details zu OOM - linux-mm.org/OOM_Killer .
slm

Antworten:

57

Der Kernel hat eine Reihe von Dingen protokolliert, bevor dies passiert ist, aber die meisten werden wahrscheinlich nicht enthalten sein /var/log/messages, je nachdem, wie Sie (r)syslogdkonfiguriert sind. Versuchen:

grep oom /var/log/*
grep total_vm /var/log/*

Ersteres sollte ein paar Mal auftauchen und letzteres nur an ein oder zwei Stellen. Das ist die Datei, die Sie anzeigen möchten.

Suchen Sie in einer der Dateien, die auch enthalten, die ursprüngliche Zeile "Nicht genügend Speicher" total_vm. Dreißig Sekunden vor einer Minute (könnte mehr sein, könnte weniger sein) vor dieser Zeile finden Sie etwas wie:

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

Sie sollten auch eine Tabelle irgendwo zwischen dieser Zeile und der Zeile "Out of Memory" mit Überschriften wie folgt finden:

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

Dies sagt Ihnen vielleicht nicht viel mehr als Sie bereits wissen, aber die Felder sind:

  • pid Die Prozess-ID.
  • uid Benutzer - ID.
  • tgid Thread-Gruppen-ID.
  • total_vm Nutzung des virtuellen Speichers (in 4 kB Seiten)
  • rss Nutzung des residenten Speichers (in 4-kB-Seiten)
  • nr_ptes Seite Tabelleneinträge
  • swapents Swap - Einträge
  • oom_score_adj Normalerweise 0; Eine niedrigere Zahl gibt an, dass der Prozess weniger wahrscheinlich abstürzt, wenn der OOM-Killer aufgerufen wird.

Sie können meistens ignorieren nr_ptesund swapentsobwohl ich glaube, dass dies Faktoren sind, die bestimmen, wer getötet wird. Dies ist nicht unbedingt der Prozess, der den meisten Speicher benötigt, aber es ist sehr wahrscheinlich. Weitere Informationen zum Auswahlverfahren finden Sie hier . Grundsätzlich wird der Prozess, der am Ende die höchste OOM-Punktzahl aufweist, beendet. Dies ist die "Punktzahl", die in der Zeile "Nicht genügend Speicher" angegeben ist. Leider werden die anderen Werte nicht gemeldet, aber diese Tabelle enthält einige Hinweise in Bezug auf Faktoren.

Auch hier wird dies wahrscheinlich nicht viel mehr tun, als das Offensichtliche zu beleuchten: Dem System ging der Speicher aus und es mysqldwurde beschlossen, zu sterben, weil das Töten die meisten Ressourcen freisetzen würde . Dies bedeutet nicht, dass mysqldetwas falsch gemacht wird. Sie können sich die Tabelle ansehen, um festzustellen, ob zu diesem Zeitpunkt noch etwas nicht stimmte, aber es gibt möglicherweise keinen eindeutigen Schuldigen: Das System verfügt möglicherweise nicht über genügend Arbeitsspeicher, nur weil Sie die ausgeführten Prozesse falsch eingeschätzt oder konfiguriert haben.

Goldlöckchen
quelle
5
dmesgist, wo dies garantiert ist. Es wird nur in sein, /var/logwenn der Syslog-Daemon von liest /dev/kmsg(was es normalerweise aber tut).
Patrick
2
@Patrick Das kommt drauf an, wann du schaust. Wenn es in einem der normalen Dateiprotokolle aufgezeichnet ist (sollte es sein oder Sie haben etwas Dummes mit Ihrem Protokolliergerät getan), ist es für eine lange Zeit dort, wohingegen zu diesem Zeitpunkt das OP ein aufgetretenes Problem diagnostizieren möchte gestern oder am Tag zuvor usw. ist der Datensatz möglicherweise nicht dmesgmehr vorhanden, auch wenn das System noch ausgeführt wurde.
Goldlöckchen
6

Der Schlüssel dazu liegt in der Nachricht selbst - Zu wenig Speicher . Wenn dem Linux-Kernel der virtuelle Speicher (physischer RAM plus Swap) ausgeht, werden Prozesse abgebrochen, und genau das ist hier passiert. Anscheinend mysqldwurden über 2 GB virtueller Speicher verwendet.

Wie viel RAM und Swap hat das System? Ich würde in Betracht ziehen, zusätzlichen RAM hinzuzufügen oder, falls dies nicht möglich ist, zusätzlichen Swap hinzuzufügen. Als schnelle Lösung, um zumindest zu verhindern, dass Prozesse beendet werden, können Sie eine Auslagerungsdatei hinzufügen.

Update: Anhand des verfügbaren Arbeitsspeichers können Sie das Problem sofort erkennen. Sie haben ~ 1,6 GB RAM und 100 MB Swap, aber MySQL verwendet viel mehr RAM als das. Das erklärt, warum Sie sehen, dass Prozesse beendet werden.

mjturner
quelle
total used free shared buffers cached Mem: 1655 934 721 0 10 52 -/+ buffers/cache: 871 784 Swap: 109 6 103 Dies ist die Speicherausgabe zur gleichen Zeit, als der Prozess beendet wurde
ibedelovski
Können Sie das vielleicht in die ursprüngliche Nachricht einfügen, wobei die Formatierung beibehalten wird? Würde das Lesen erleichtern.
mjturner
Ich kann nicht wirklich gut formatieren ... aber
füge