Linux OOM killer
一、写在前面
最近学习 docker 过程中遇到 --oom-score-adj 和 --oom-kill-disable 的参数,所以就查阅资料简单了解下OOM并加以记录,并没有看过内核相关的书籍(菜鸡一个 -_- | |),各位路过的道友有好书可以推荐下,十分感谢,mua~~
二、什么是OOM
OOM 就是 out of memory 的缩写,当“不合格”的程序运行在你的系统上,它会吃掉你所有的内存资源,导致kernel无法分配内存在其它进程(OOM)。虽然系统管理员可以增加内存来临时解决问题,但想从根本上解决还是要处理掉这个问题程序。不过在管理员干涉之前,遇到 OOM 时 kernel 也有自己的处理方式,这要根据 OOM 的参数来进行相应的处理。
三、OOM相关参数
1. /proc/sys/vm/panic_on_oom
-
Arguments
-
值为0:表示启动 OOM killer。
- 当 panic_on_oom的值为0或者上一步没有触发 kernel panic,kernel 就会检查/proc/sys/vm/oom_kill_allocating_task。
-
值为1:表示有可能会触发 kernel panic,也有可能启动 OOM killer。
-
值为2:表示强制触发 kernel panic,内核崩溃GG。
-
2. /proc/sys/vm/oom_kill_allocating_task
-
Arguments
- 值为0:会 kill 掉得分最高的进程(怎么计分的往下看)
- 值为非0:会kill 掉当前申请内存而触发OOM的进程
- 当然,一些系统进程(如init)或者被用户设置了oom_score_adj的进程等可不是说杀就杀的。
3. /proc/sys/vm/oom_dump_tasks
-
Introduction
- 作为系统管理员,我们肯定希望不管是出现 kernel panic 或者 OOM killer 的情况都能够留下些类似日志的东西,让我们能了解出现此种情况的原因,oom_dump_tasks参数可以记录进程标识信息、该进程使用的虚拟内存总量、物理内存、进程的页表信息等等。
-
Arguments
-
值为0:关闭打印上述日志。在大型系统中,可能存在有上千个进程,逐一打印使用内存信息可能会造成性能问题。
-
值为非0:有三种情况会打印进程内存使用情况
- 由 OOM 导致 kernel panic 时
- 没有找到符合条件的进程 kill 时
- 找到符合条件的进程并 kill 时
-
4. oom_adj、oom_score_adj 和 oom_score
-
Introduction
- 之所以放在一起,是因为这三个参数的关联性比较紧密。这三个参数都和具体的进程相关,所以位置都是在 /proc/进程PID/ 目录下。假设现在已经选择的是出现 OOM 的时候启动 killer,那么 kill 哪个进程呢?那就要看它们的的分数了,分数越高 G 的越快。(突然觉得做学渣还是蛮幸福的 _ )
- 内核会对进程打分(oom_score),主要包括两部分,系统打分和用户打分。系统打分就是根据进程的物理内存消耗量;用户打分就是 oom_score_adj 的值。如果用户指定 oom_score_adj 的值为 -1000,也就是表示禁止 OOM killer 杀死该进程。
- 用户可以通过调整 oom_score_adj 的值来决定最终 oom_score 的值,oom_score_adj 的取值范围是 -1000~1000,为0时表示用户不调整 oom_score。另外,root进程拥有3%的内存使用特权,因此做最终 oom_score 计算时需要减去这些内存使用量。
- oom_adj是一个旧的接口参数,其功能类似oom_score_adj,为了兼容,目前仍然保留这个参数,当操作这个参数的时候,kernel实际上是会换算成oom_score_adj。
四、参考资料
写作不易,转载请注明出处,谢谢~~