该答案根据的值解释了内核在遇到OOM情况时采取的措施sysctl vm.overcommit_memory
。
当overcommit_memory
设置为0或1时,将overcommit
被启用,并且允许程序分配比实际可用更多的内存。
现在,当我们在这种情况下用尽内存时会发生什么?OOM杀手如何决定首先杀死哪个进程?
该答案根据的值解释了内核在遇到OOM情况时采取的措施sysctl vm.overcommit_memory
。
当overcommit_memory
设置为0或1时,将overcommit
被启用,并且允许程序分配比实际可用更多的内存。
现在,当我们在这种情况下用尽内存时会发生什么?OOM杀手如何决定首先杀死哪个进程?
Answers:
如果内存被进程彻底耗尽,可能会威胁到系统的稳定性,那么OOM杀手into可危。
注意: OOM Killer的任务是继续终止进程,直到释放足够的内存以使内核尝试运行的其余进程顺利运行为止。
OOM杀手必须选择要杀死的最佳过程。这里最好的是指这样的过程,该过程将在终止时释放最大的内存,并且对系统来说也最不重要。
主要目标是杀死最少数量的进程,以最大程度地减少造成的损害,同时最大程度地释放所释放的内存。
为方便起见,内核oom_score
为每个进程维护一个。您可以在目录下的文件系统中看到oom_score
每个进程。/proc
pid
$ 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