web-dev-qa-db-ja.com

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_

私は16GB RAMマシンで複数のVMを実行していますが、それらはすべて一緒に最大9GBのRAMを使用します。

時々、Linux oom killerがやって来て、プロセスを強制終了します。ほとんどのメモリを使用するプロセスを選択すると思います。この場合は6GBのWindowsVMです。
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child

利用可能な最大6.6GBのキャッシュメモリがあるため、私見では、マシンをOOM状況にしないでください。ここで、メモリ分散とその結果のoomkillを確認できます。

memory distribution

Kvmsのpidの_oom_adj_を_-17_に設定したので、oom-killerはこのプロセスを強制終了しません。

しかし、カーネルがプロセスを強制終了する必要があると考え、先に進んでキャッシュされたメモリを解放しない理由をまだ理解できていません。

  • なぜこれが起こるのか誰かが説明できますか?
  • PIDを知らずにoomkillerがkvmプロセスを強制終了するのを防ぐ方法を教えてください。
7
Momo

次の方法で、特定のプロセスの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 Killerの飼いならし

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

多くの場合、overtuningと呼ばれる現象が観察されます。この場合、説明されているovercommit_memoryここ

ソース proc filesystems

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.
2
user55518