Linux下OOM Killer机制详解

Linux中malloc函数返回非零值,并不意味着指向的内存一定可用。Linux下允许程序申请比系统可用内存更多的内存,这种机制叫做Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用,当使用的时候系统就已经回收了足够的资源供使用(maybe)。不幸的是,当你要使用这部分内存,但系统并没有足够的资源以供使用,则会调用OOM Killer机制。Linux下Overcommit有三种策略,(参看内核源码vm/overcommit-accouting),可以在proc/sys/vm/overcommit_memory设置,取0,1,2三种值,默认为0.

0:启发式策略,比较严重的Overcommit将不能得逞,比如你突然申请了128TB的内存,而轻微的Overcommit将被允许。另外,root能Overcommit的值比普通用户要稍微多些。

1:永远允许Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。

2:永远禁止Overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。


Linux下每个进程都有个OOM权重,在/proc/ <pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。

最终OOM killer是通过/proc/<pid>/oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。

另外,Linux在计算进程的内存消耗的时候,会将子进程所耗内存的一半同时算到父进程中。这样,那些子进程比较多的进程就要小心了。

参考文档:

1、Memory overcommit in Linux

2、Taming the OOM killer

3、When Linux Runs Out of Memory


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值