Linux的oom killer机制学习

    我们项目在跑大量用户时,经常会出现进程死掉的情况,dmsg看到是oom机制杀掉了,刚好乘机学习一下linux的oom机制。

    OOM(Out of Memory)机制是Linux内核的自我保护机制,当系统内存不够使用时会触发,系统会挑选一个占用内存较多的进程来杀掉释放内存。

       Linux内核允许程序申请比系统可用内存更多的内存(malloc),这个特性称为overcommit,这样做的目的是出于优化系统的考虑,因为并不是所有的程序都是申请了内存就立刻使用,当使用的时候说不定系统已经回收了一些内存资源,当然如果系统没有足够多的内存资源可用时,OOM机制就被触发了。

    Linux下的OverCommit策略有三种,可以通过/proc/sys/vm/overcommit_memory配置,取值范围0、1和2,默认0:

1.  取值0:启发式策略,比较多的内存申请可能会被拒绝,如当前内存2G,突然申请1T的内存(一般当系统启动selinux模块时有效,其他情况等同取值1);

2.  取值1:允许分配比当前内存资源多的内存;

3.  取值2:系统所能分配的内存资源不能超过swap+内存资源*系数(/proc/sys/vm/overcommit_ratio,默认50%,可调整)。如果资源已经用光,再有内存申请请求时,都会返回错误

      如果系统触发了OOM机制,系统会选择杀掉某些进程,系统是怎么选择应该杀的进程呢?/proc/$(pidof xxx)/oom_adj,该进程备oom killer杀掉的权重,介于[-17,15]之间,默认是0,权重越高,意味着被oom kill的可能性更大,-17表示禁止被kill。/proc/$(pidof xxx)/oom_score就是当前进程的被kill的分数,越高的分数意味着越可能被kill,这个分数是根据oom_adj算出(2ⁿ).

       那我们应该怎么做去防止oom killer呢

1.禁止指定进程被OOM杀掉

    echo -17 > /proc/$(pidof xxx)/oom_adj

2.关闭oom机制(不推荐)

    echo "vm.panic_on_oom=1" >> /etc/sysctl.conf

    sysctl -p

猜你喜欢

转载自blog.csdn.net/yangrendong/article/details/88987981
今日推荐