sysctl vm.overcommit_memory
的值解释了内核在遇到OOM情况时采取的措施。 当
overcommit_memory
设置为0或1时,启用overcommit
,并且允许程序分配比实际可用更多的内存。 现在在这种情况下我们内存不足时会发生什么? OOM杀手如何决定首先杀死哪个进程?
#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小时前
评论
我认为值是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均为有效值。