KVM虚拟机被OOM killer

2019/06/28 11:42
阅读数 8

一、线上环境的虚拟机被KVM物理机kill掉

Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于每个进程的,内核直接回收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commit memory)的办法来间接利用这部分 “空闲” 的内存,提高整体内存的使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括 swap)的容量,内核(OOM killer)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子来讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。

内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码 linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory() 被触发,然后调用 select_bad_process() 选择一个 “bad” 进程杀掉,如何判断和选择一个 “bad” 进程呢,总不能随机选吧?挑选的过程由 oom_badness() 决定,挑选的算法和想法都很简单很朴实:最 bad 的那个进程就是那个最占用内存的进程。

# vim /var/log/message

Jun 28 11:08:15 192-168-3-151 kernel: Out of memory: Kill process 45940 (qemu-kvm) score 89 or sacrifice child Jun 28 11:08:15 192-168-3-151 kernel: Killed process 45940 (qemu-kvm) total-vm:17781332kB, anon-rss:14722760kB, file-rss:0kB Jun 28 11:08:15 192-168-3-151 kernel: qemu-kvm invoked oom-killer: gfp_mask=0x2040d0, order=0, oom_score_adj=0 Jun 28 11:08:15 192-168-3-151 kernel: qemu-kvm cpuset=vcpu0 mems_allowed=0-1 Jun 28 11:08:15 192-168-3-151 kernel: CPU: 22 PID: 4675 Comm: qemu-kvm Not tainted 3.10.0-327.el7.x86_64 #1 Jun 28 11:08:15 192-168-3-151 kernel: Hardware name: Dell Inc. PowerEdge R730/0WCJNT, BIOS 2.7.1 001/22/2018 Jun 28 11:08:15 192-168-3-151 kernel: ffff881de8bd9700 00000000a259c369 ffff881d7ff33730 ffffffff816351f1 Jun 28 11:08:15 192-168-3-151 kernel: ffff881d7ff337c0 ffffffff81630191 ffff881e35998600 ffff881e35998618 Jun 28 11:08:15 192-168-3-151 kernel: 0000000000000206 ffff881de8bd9700 ffff881d7ff337a8 ffffffff8112882f

二、配置OOM killer

准确的说这几个参数都是和具体进程相关的,因此它们位于/proc/xxx/目录下(xxx是进程ID)。假设我们选择在出现OOM状况的时候杀死进程,那么一个很自然的问题就浮现出来:到底干掉哪一个呢?内核的算法倒是非常简单,那就是打分(oom_score,注意,该参数是read only的),找到分数最高的就OK了。

对某一个task进行打分(oom_score)主要有两部分组成,一部分是系统打分,主要是根据该task的内存使用情况。另外一部分是用户打分,也就是oom_score_adj了,该task的实际得分需要综合考虑两方面的打分。如果用户将该task的 oom_score_adj设定成OOM_SCORE_ADJ_MIN(-1000)的话,那么实际上就是禁止了OOM killer杀死该进程。

echo -15 >/proc/77420/oom_score_adj
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部