理解oom_killer备忘

本文深入探讨了Linux系统中OOM(Out of Memory)机制的工作原理,包括如何判断和选择要终止的进程,以及影响进程得分的因素。文章还介绍了OOM策略的配置方法,通过调整/proc/sys/vm/overcommit_memory和/proc/sys/vm/overcommit_ratio参数,可以有效控制系统的内存使用策略。

原理:

  OOM发生的条件一般有两个:

  1. VM里面分配不出更多的page

  2. 用户地址空间不足

 

  按照资料,找到了oom_kill.c​文件中的out_of_memory() pagefault_out_of_memory()及调用函数__out_of_memory()

  1:”找到一个需要被kill的进程“

    策略:跳过kernel thread、没有占用mem的进程、INIT进程、以及被设置为OOM_DISABLE的进程(附1),检测其它进程得到一个得分。

    得分:影响因素有以下几个:     

        a) score起始为该进程占用的total_vm;

                    points = mm->total_vm;

 

        b) 如果该进程有子进程,子进程独自占用的total_vm/2加到本进程score;

                    points += child->mm->total_vm/2 + 1;

 

        c) score和进程的cpu_time以及run_time成反比;(实现方式着重记录)

                     points /= int_sqrt(cpu_time);

                     points /= int_sqrt(int_sqrt(run_time));

 

        d) nice大于0的进程,score翻倍;

                    if (task_nice(p) > 0) points *= 2;

 

        e) 对设置了超级权限的进程和直接磁盘交互的进程降低score;

                    if (CAP_SYS_ADMIN | CAP_SYS_RESOURCE | CAP_SYS_RAWIO) points /= 4;

 

        f) 如果和current进程在内存上没有交集的进程降低score;

                    if (!has_intersects_mems_allowed(p)) points /= 8;

 

        g) 最后是根据该进程的oom_adj计算最终的score;

                    points <<= abs(oom_adj);

 

  2:“杀掉要被kill的进程”

    方法:发出一个SIGKILL信号

 

OOM 策略调整:

  

  可以通过下面两个参数来配置OOM策略:

    /proc/sys/vm/overcommit_memory 

    /proc/sys/vm/overcommit_ratio

  overcommit_memory取值为[0-2]:

    0:表示按启发模式进行overcommit(可以提交超过物理内存大小的alloc page申请),也是默认的设置;

    1:表示总是允许overcommit,这种模式最容易触发oom;

    2:表示不能overcommit。这种模式下,最大的User Space限制在:SS + RAM*(r/100),SS是swap大小,r就是overcommit_ratio设置的值,范围为:[0-100];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值