操作系统其实是没办法去区分哪个是我的关键任务进程的,oom-killer的作者有这么段话:
If we run out of memory, we have the choice between either killing a random task (bad) letting the system crash (worse), OR try to be smart about which process to kill. Note that we don't have to be perfect here, we just have to be good.
在我的上一篇内容里面,我调整的是进程的oom_score_adj,这个是配置在内核文件的,范围是-1000~1000,默认是0。我上次调整的值很保守(-3~-15),这个范围值的调整基本影响不到oom-killer的判断,它该误杀还是误杀(冷血无情)。oom-killer的选择策略受进程占用内存和oom_score_adj的影响,所以在设置oom_score_adj的值上可以“激进”些,比如直接设置为-1000,如果细心观察可以看到sshd进程的oom_score_adj设置的就是-1000。
这里带来了另外一个问题,占用最大内存的进程在调整了oom_score_adj为-1000后,避免oom-killer的打杀,这时系统又确实需要分配新的内存出来给其他进程,巧妇难为无米之炊呀!这里可以选择对swap分区进行扩容:
dd if=/dev/zero of=/data/swap bs=1M count=4096
chmod 600 /data/swap
mkswap /data/swap
swapon /data/swap