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.mysqld
postfix
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)syslogd
System 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
, swapents
obwohl 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 mysqld
wurde ausgewählt, zu sterbenweil seine Tötung die meisten Ressourcen freisetzen würde. Das bedeutet nicht unbedingt, mysqld
dass 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.