oom-kill分析

230阅读 0评论2017-07-05 fly123456789
分类:LINUX

http://blog.csdn.net/zhoujixin2010/article/details/7013887

 Oom-kill就是out-of-memory,,在内核中有一层保护机制,用于避免在内存不足的时候不至于严重的问题,把无关紧要的进程杀掉。这就是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):



上一篇:i2c tool 的使用
下一篇:利用 SysRq 键排除和诊断系统故障 及 SysRq使用