Linux OOM/LMK 原理分析

伙伴系统无法分配内存时,会通过OOM函数直接kill线程来回收内存.

快速分配->慢速分配->kswap内存回收->内存规整->直接内存回收->out_of_memory

__alloc_pages_nodemask->__alloc_pages_slowpath->__alloc_pages_direct_compact

                                                                                               ->__alloc_pages_direct_reclaim

                                                                                                ->__alloc_pages_may_oom->out_of_memory

进程得分相关参数,每个进程独有

参数名称 	含义
oom_score 	进程oom_badness计算得分,为只读参数。
oom_score_adj 	计算进程得分时的调整值。取值范围是-1000~1000,0表示不调整得分,负值表示在实际打分值上减去一个折扣,正值表示要惩罚该进程增加得分。
oom_adj 	旧的计算进程得分时的调整值,实际使用时会转换为oom_score_adj。

oom_score_adj取值范围-1000-1000

每个进程的得分 oom_score =  (进程占用内存*1000)/(系统总内存) + oom_score_adj ,计算函数oom_badness

可以看出oom_score_adj越大,进程得分越高,越容易被选择回收.

oom_adj是兼容以前的API接口. oom_score_adj =  (oom_adj*1000)/(17)      oom_adj取值范围(-17,15)

android系统实现了lowmemorykill驱动,实现原理跟Linux的OOM类似,也是选择oom_score_adj最大的进行kill .

通过注册register_shrinker(&lowmem_shrinker)来实现,当进行内存回收时,调用堆栈:

shrink_zone->shrink_slab回调

猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/84993568