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
, mysqld
oder postfix
ich 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`
linux
logs
memory
out-of-memory
ibedelovski
quelle
quelle
dmesg
?Antworten:
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)syslogd
konfiguriert sind. Versuchen: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:Sie sollten auch eine Tabelle irgendwo zwischen dieser Zeile und der Zeile "Out of Memory" mit Überschriften wie folgt finden:
Dies sagt Ihnen vielleicht nicht viel mehr als Sie bereits wissen, aber die Felder sind:
Sie können meistens ignorieren
nr_ptes
undswapents
obwohl 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
mysqld
wurde beschlossen, zu sterben, weil das Töten die meisten Ressourcen freisetzen würde . Dies bedeutet nicht, dassmysqld
etwas 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.quelle
dmesg
ist, wo dies garantiert ist. Es wird nur in sein,/var/log
wenn der Syslog-Daemon von liest/dev/kmsg
(was es normalerweise aber tut).dmesg
mehr vorhanden, auch wenn das System noch ausgeführt wurde.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
mysqld
wurden ü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.
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