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 的机器上运行多个虚拟机,它们总共使用 ~9GB RAM。
linux oom Killer 时不时地过来杀死一个进程。我猜它会选择使用大部分内存的进程 - 在本例中是 6GB Windows VM:
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child
恕我直言,机器不应该处于 OOM 情况,因为有 ~6.6GB 可用缓存内存。您可以在此处查看内存分配和由此产生的 oom Kill:
oom_adj
我现在已将kvm 的 pid设置为-17
,因此 oom-killer 不会终止此进程。
但我仍然无法理解为什么内核认为它必须杀死一个进程并且不会继续释放一些缓存内存。
- 谁能解释为什么会发生这种情况?
- 你能告诉我如何防止 oom Killer 在不知道 PID 的情况下杀死我的 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.