Debuggen von unzureichendem Arbeitsspeicher mit /var/log/messages

Debuggen von unzureichendem Arbeitsspeicher mit /var/log/messages

Der folgende Bericht wird in mein Nachrichtenprotokoll ausgegeben:

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 für oder auftritt httpd, aber ich bin neugierig, wie ich mit der Fehlerbehebung des Problems fortfahren kann.mysqldpostfix

Wie kann ich weitere Informationen darüber erhalten, warum PID 9163 beendet wird? Ich bin nicht sicher, ob Linux irgendwo den Verlauf der beendeten PIDs speichert.

Wenn dies in Ihrer Nachrichtenprotokolldatei auftritt, wie beheben Sie dieses Problem Schritt für Schritt?

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`

Antwort1

Der Kernel hat eine Menge Zeug protokolliert, bevor dies passiert ist, aber das meiste davon wird wahrscheinlich nicht in enthalten sein /var/log/messages, je nachdem, wie Ihr (r)syslogdSystem konfiguriert ist. Versuchen Sie:

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

Ersteres sollte mehrmals vorkommen und Letzteres nur an ein oder zwei Stellen. Das ist die Datei, die Sie sich ansehen möchten.

Suchen Sie in einer der Dateien, die auch enthält, nach der ursprünglichen Zeile „Nicht genügend Arbeitsspeicher“ total_vm. Dreißig Sekunden bis eine Minute (kann mehr, kann 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 außerdem irgendwo zwischen dieser Zeile und der Zeile „Nicht genügend Arbeitsspeicher“ eine Tabelle mit Überschriften wie dieser finden:

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

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

  • pidDie Prozess-ID.
  • BenutzerkennungBenutzer-ID.
  • tgidThread-Gruppen-ID.
  • total_vmVirtueller Speicherverbrauch (in 4 kB Seiten)
  • rssResidenter Speicherverbrauch (in 4 kB Seiten)
  • nr_ptesSeitentabelleneinträge
  • TauschobjekteEinträge tauschen
  • oom_score_adjNormalerweise 0; eine niedrigere Zahl zeigt an, dass die Wahrscheinlichkeit, dass der Prozess beendet wird, wenn der OOM-Killer aufgerufen wird, geringer ist.

Sie können diese Faktoren größtenteils ignorieren nr_ptes, swapentsobwohl ich glaube, dass sie bestimmen, wer getötet wird. Dies ist nicht unbedingt der Prozess, der am meisten Speicher verbraucht, aber sehr wahrscheinlich schon. Weitere Informationen zum Auswahlprozess finden Sie untersiehe hier. Grundsätzlich wird der Prozess beendet, der am Ende den höchsten oom-Score erreicht – das ist der „Score“, der in der Zeile „Nicht genügend Arbeitsspeicher“ angegeben wird. Die anderen Scores werden leider nicht angegeben, aber die Tabelle bietet einige Hinweise hinsichtlich der Faktoren.

Auch dies wird wahrscheinlich nicht viel mehr bewirken, als das Offensichtliche zu verdeutlichen: Das System hatte nicht genügend Speicher und mysqldwurde ausgewählt, zu sterbenweil seine Tötung die meisten Ressourcen freisetzen würde. Das bedeutet nicht unbedingt, mysqlddass Sie etwas falsch machen. Sie können in der Tabelle nachsehen, ob sonst irgendetwas schiefgelaufen ist, aber es muss keinen eindeutigen Schuldigen geben: Dem System kann der Arbeitsspeicher ausgehen, einfach weil Sie die laufenden Prozesse falsch eingeschätzt oder falsch konfiguriert haben.

Antwort2

Der Schlüssel hierzu liegt in der Botschaft selbst -Nicht genügend Arbeitsspeicher. Wenn dem Linux-Kernel der virtuelle Speicher (physischer RAM plus Swap) ausgeht, beginnt er, Prozesse zu beenden, und genau das ist hier passiert. Es sieht so aus, als ob mysqldüber 2 GB virtueller Speicher verwendet wurden.

Wie viel RAM und Swap hat das System? Ich würde in Erwägung ziehen, zusätzlichen RAM hinzuzufügen oder, falls das nicht möglich ist, zusätzlichen Swap. Als schnelle Lösung, um zumindest das Beenden von Prozessen zu verhindern, könnten Sie eine Swap-Datei hinzufügen.

Aktualisieren:Wenn Sie sich die Menge an RAM ansehen, die Sie haben, können Sie das Problem sofort erkennen. Sie haben ~1,6 GB RAM und 100 MB Swap, aber MySQL verwendet viel mehr RAM. Das erklärt, warum Prozesse beendet werden.

verwandte Informationen