Linux内核为了提高内存的使用效率采用过度分配内存(over-commit memory)的办法,造成物理内存过度紧张进而触发OOM机制来杀死一些进程回收内存。
该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽会把该进程杀掉。
Linux在内存分配路径上会对内存余量做检查,(1)如果检查到内存不足,则触发OOM机制。(2)OOM首先会对系统所有进程(出init和内核线程等特殊进程)进行打分,并选出最bad的进程;然后杀死该进程。(3)同时会触发内核oom_reaper进行内存收割。(4)同时内核还提供了sysfs接口系统OOM行为,以及进程OOM行为。然后借用一个示例来分析OOM时内存状态。
关于OOM
内核检测到系统内存不足,在内存分配路径上触发out_of_memory(),然后调用select_bad_process()选择一个’bad’进程oom_kill_process()杀掉,判断和选择一个‘bad’进程的过程由oom_badness()决定。
Linux下每个进程都有自己的OOM权重,在/proc//oom_adj里面,范围是-17到+15,取值越高,越容易被杀掉。