kvm version: QEMU emulator version 1.1.2 (qemu-kvm-1.1.2+dfsg-6+deb7u3, Debian), Copyright (c) 2003-2008 Fabrice Bellard
libvirtd version: libvirtd (libvirt) 0.9.12.3
debian version:7.5
Ich verwende mehrere VMs auf einem 16-GB-RAM-Computer. Insgesamt verwenden sie ~ 9 GB RAM.
Hin und wieder kommt der Linux Oom Killer vorbei und beendet einen Prozess. Ich denke, es wählt den Prozess mit dem größten Teil des Speichers - in diesem Fall eine 6 GB Windows-VM:
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child
IMHO sollte sich der Computer nicht in einer OOM-Situation befinden, da ~ 6,6 GB zwischengespeicherter Speicher verfügbar sind. Sie können die Speicherverteilung und den daraus resultierenden OOM-Kill hier sehen:
Ich habe jetzt oom_adj
die PID der KVMS auf eingestellt -17
, damit der Oom-Killer diesen Prozess nicht beendet.
Aber ich verstehe immer noch nicht, warum der Kernel glaubt, dass er einen Prozess beenden muss, und nicht fortfahren wird, zwischengespeicherten Speicher freizugeben.
- Kann jemand erklären, warum das passiert?
- Können Sie mir sagen, wie ich verhindern kann, dass der OOM-Killer meine KVM-Prozesse beendet, ohne die PID zu kennen?
tmpfs
, je nachdem, wie Sie überprüfen, ob sie als Cache / Puffer zählt, obwohl sie nicht freigegeben werden kann, wenn sie nicht ausgetauscht wird.Antworten:
Deaktivieren Sie einfach das
OOM Killer
für den jeweiligen Prozess mit:oder nach Geschmack
oom_score adj
.Jedoch:
In deinem Fall ist auch zu setzen
192
.Siehe auch Den OOM-Killer zähmen
In jedem Fall sollten Sie auch überprüfen, was den Speicherüberlauf verursacht, da der OOM Killer andere wichtige Prozesse abbricht.
Oft wird ein Phänomen namens beobachtet
overtuning
. In diesem Fallovercommit_memory
wie hier beschrieben .Quelle proc - Dateisysteme :
oom_adj:
oom_score_adj:
quelle