kvmはoomkillerによって殺された

kvmはoomkillerによって殺された

kvm バージョン: QEMU emulator version 1.1.2 (qemu-kvm-1.1.2+dfsg-6+deb7u3, Debian), Copyright (c) 2003-2008 Fabrice Bellard
libvirtd バージョン: libvirtd (libvirt) 0.9.12.3
debian バージョン:7.5

私は16 GBのRAMシステムで複数の仮想マシンを実行しており、合計〜9 GBのRAMを使用しています。

時々、Linux oom Killerが現れ、プロセスを終了します。ほとんどのメモリを使用するプロセス(この場合は6 GB Windows VM)を選択しているようです。
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child

IMHO、利用可能なキャッシュメモリが〜6.6GBなので、マシンがOOMの状況にあってはいけません。ここでは、メモリ割り当てと結果のoom killを見ることができます。

メモリ割り当て

oom_adj-17これで、oom-killerがプロセスを終了しないようにkvmのpidを設定しました。

しかし、カーネルがプロセスを終了する必要があると考えていて、一部のキャッシュメモリを解放しない理由はまだ理解できません。

  • なぜこれが起こるのかを説明できる人はいますか?
  • PIDを知らずにoom Killerが私のkvmプロセスを終了するのを防ぐ方法を教えてください。

答え1

次のコマンドを使用して特定のプロセスを無効にしますOOM Killer

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

または味でoom_score adj

しかし:

メモリ不足:プロセス25086(kvm)スコア192の終了またはサブプロセスの犠牲

あなたの場合でも192

また、見ることができますOOMキラーを飼いならす

いずれにせよ、OOM Killerは他の重要なプロセスを終了するため、メモリオーバーフローの原因も確認する必要があります。

人々はしばしばという現象を観察しますovertuning。この場合、overcommit_memory説明されているようにここ

源泉プロセスファイルシステム:

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.

関連情報