oom-kill分析

       Oom-kill就是out-of-memory,,在linux内核中有一层保护机制,用于避免linux在内存不足的时候不至于严重的问题,把无关紧要的进程杀掉。这就是oom-killer。

     首先说一下,在oom-kill.c下有两个变量,可通过/proc/sys/vm来配置,分别是:oom_kill_allocating_task和panic_on_oom。


/proc/sys/vm/oom_kill_allocating_task

默认情况下该变量为0,如果配置了此值,则当内存被耗尽时,或者内存不足已满足需要分配的内存时,会把当前申请内存分配的进程杀掉。


/proc/sys/vm/panic_on_oom

如果设置了该变量的值,则oom_killer将不会启动,当内存用尽时系统将会挂起或者重启.。


同时这里还涉及到内核当内存耗尽时的一种策略,/proc/sys/vm/overcommit_memory可用于配置这种策略:

overcommit_memory == 2,物理内存使用完后,打开任意一个程序均显示内存不足;

overcommit_memory == 1,会从buffer中释放较多物理内存,oom-kill也会继续起作用;

overcommit_memory ==0,系统默认设置,释放较少物理内存,使得oom-kill机制运作比较明显。

也就是说,如果overcommit_memory==2时,内存耗尽时,oom-kill是不会起作用的,系统不会再打开其他程序了,只有等待正在运行的进程释放内存。


oom-kill.c里有几个比较重要的函数,分别是:out_of_memory, __out_of_memory,select_bad_process,badness。


out_of_memory执行流程:

1.如果sysct——panic_on_oom已设置(就是不为0),则系统内存耗尽时不会启动oom_killer,系统直接调用panic函数,否则进入下一步;

2,调用__out_of_memory


__out_of_memory执行流程:

1.sysctl_oom_kill_allocating_task如果该变量值已设置,则直接杀掉当前申请内存分配的进程;否则进入下一步;

2.调用select_bad_process,选择一个最优的进程杀掉,如果没有选到一个可以杀掉的进程,则系统panic;如果进程无法杀掉,则继续此步。


select_bad_process,badness附上代码说明(linux2.6.34 oom-kill.c):



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值