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):