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

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

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

评论

我认为值是1和2-而不是0和1。

从这里serverfault.com/questions/606185/…,0和1是正确的值。

linux-mm.org/OOM_Killer提供了出色的说明

根据kernel.org/doc/Documentation/vm/overcommit-accounting,0、1和2均为有效值。

#1 楼

如果内存被进程完全耗尽,可能会威胁到系统的稳定性,那么OOM杀手就会出现。
注意:OOM杀手的任务是继续杀死进程直到释放了足够的内存,以使内核尝试运行的其余过程顺利运行。
OOM Killer必须选择要杀死的最佳进程。最好在这里指的是在杀死进程时将释放最大内存的进程,也是对系统而言最不重要的进程。
主要目标是杀死最少数量的进程,以最小化所造成的损害,同时
为方便起见,内核为每个进程维护一个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

评论


美好不是也起作用吗?

–neverMind9
18/12/20在15:29

还有一个有用的oom_score_adj

– Bohdan_trotsenko
11小时前