OOM杀手如何决定首先杀死哪个进程?


92

答案根据的值解释了内核在遇到OOM情况时采取的措施sysctl vm.overcommit_memory

overcommit_memory设置为0或1时,将overcommit被启用,并且允许程序分配比实际可用更多的内存。

现在,当我们在这种情况下用尽内存时会发生什么?OOM杀手如何决定首先杀死哪个进程?


1
我认为值是1和2-不是0和
1。– fpmurphy 2014年



Answers:


109

如果内存被进程彻底耗尽,可能会威胁到系统的稳定性,那么OOM杀手into可危。

注意: OOM Killer的任务是继续终止进程,直到释放足够的内存以使内核尝试运行的其余进程顺利运行为止。

OOM杀手必须选择要杀死的最佳过程。这里最好的是指这样的过程,该过程将在终止时释放最大的内存,并且对系统来说也最不重要。

主要目标是杀死最少数量的进程,以最大程度地减少造成的损害,同时最大程度地释放所释放的内存。

为方便起见,内核oom_score为每个进程维护一个。您可以在目录下的文件系统中看到oom_score每个进程。/procpid

$ cat /proc/10292/oom_score

oom_score任何过程的价值越高,在内存不足的情况下被OOM Killer杀死的可能性就越高。

如何OOM_Score计算?

在David的补丁集中,旧的badness()启发式方法几乎完全消失了。取而代之的是,计算变成了一个简单的问题,即进程正在使用多少百分比的可用内存。如果整个系统内存不足,则“可用内存”是系统可用的所有RAM和交换空间的总和。

如果相反,OOM情况是由于耗尽给定cpuset /控制组所允许的内存而引起的,则“可用内存”是分配给该控制组的总量。如果超出了内存策略施加的限制,则会进行类似的计算。在每种情况下,该进程的内存使用都被视为其驻留集(它正在使用的RAM页数)与其交换使用之和。

该计算结果是百分之十的数字。使用内存的每个字节的进程的得分为1000,而完全不使用内存的进程的得分为零。对该分数的启发式调整很少,但是代码仍然会从根拥有的流程的分数中减去一小部分(30),因为它们比用户拥有的流程更有价值。

应用的另一项调整是添加存储在每个进程的oom_score_adj变量中的值,可以通过/ proc对其进行调整。该旋钮允许调整每个过程对用户空间中OOM杀手的吸引力。将其设置为-1000将完全禁用OOM杀死功能,而将其设置为+1000则等效于在关联的进程上绘制大型目标。

参考文献

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326


3
美好不是也起作用吗?
neverMind9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.