kvm von oomkiller getötet

7

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:

Speicherverteilung

Ich habe jetzt oom_adjdie 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?
Momo
quelle
Klingt für mich nach diesem Fehler: bugzilla.redhat.com/show_bug.cgi?id=903432
slm
Überprüfen Sie auch, ob eine vollständige Datei vorhanden ist 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.
Frostschutz

Antworten:

2

Deaktivieren Sie einfach das OOM Killerfür den jeweiligen Prozess mit:

for p in $(pidof kvm qemu-system32_x64); do
  echo -n '-17' > /proc/$p/oom_adj
done

oder nach Geschmack oom_score adj.

Jedoch:

Nicht genügend Speicher: Töte den Prozess 25086 (kvm) mit 192 oder opfere das Kind

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 Fall overcommit_memorywie hier beschrieben .

Quelle proc - Dateisysteme :

oom_adj:

For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
be used to tune the badness score.  Its acceptable values range from -16
(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
scaled linearly with /proc/<pid>/oom_score_adj.

oom_score_adj:

The value of /proc/<pid>/oom_score_adj is added to the badness score before it
is used to determine which task to kill.  Acceptable values range from -1000
(OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX).  This allows userspace to
polarize the preference for oom killing either by always preferring a certain
task or completely disabling it.  The lowest possible value, -1000, is
equivalent to disabling oom killing entirely for that task since it will always
report a badness score of 0.

quelle
1
Erstens: oom_adj ist veraltet, die neue Datei ist oom_score_adj. Dies löst auch nicht das Problem, dass zwischengespeicherter Speicher verfügbar ist (neben 16 GB Swap), der nie berührt wird.
Momo
danke, abgeschlossen. Haben Sie 192 Punkte erzielt, wie es geschrieben steht? Was veranlasst den OOM Killer, Aufgaben zu töten?