OOM是out-of-memory的缩写,Linux 内核引入OOM管理机制主要是为了解决因系统内存耗尽导致内存分配失败,内核应该如何处理的问题。内核中提供了两种方式:
系统也提供了若干个配置参数选项可供选择,接下来介绍这些参数的作用以及这些参数如何影响系统的行为。
配置所在的路径为/proc/sys/vm/panic_on_oom,不同取值对应的行为如下表所示:
取值 | 描述 |
0 | 系统不会触发panic |
1 | 系统有可能触发panic |
2 | 如果触发OOM,内核会panic |
主要检查函数check_panic_on_oom,所在文件为mm/oom_kill.c,函数主要逻辑如下:
配置所在的路径为/proc/sys/vm/oom_dump_tasks,不同取值对应的行为如下表所示:
取值 | 描述 |
0 | 内核触发OOM,打印所有系统任务信息 |
1 | 内核触发OOM,不打印系统任务信息 |
主要流程在dump_task函数中,所在文件为mm/oom_kill.c
配置所在的路径为/proc/sys/vm/oom_kill_allocating_task,取值范围及其对应的系统行为如下表所示:
取值 | 描述 |
0 | 如果触发OOM,内核会检查每个进程的分数,得分最高的进程会被kill掉 |
1 | 触发OOM,内核会kill掉当前在申请内存的进程 |
参数解析
旧的配置参数,功能与oom_score_adj类似,内核为了保持向后兼容保留了这个参数。用于调整进程OOM得分的配置,配置所在路径为/proc/
取值 | 描述 |
[-17, 15] | 用于调整进程的OOM得分。 |
设置oom_adj时会将其转换为oom_score_adj,转换关系如下:
如果oom_adj的值取最大(15),对应的oom_score_adj为OOM_SCORE_ADJ_MAX(1000)
否则转换关系式为:oom_score_adj = oom_adj * OOM_SCORE_ADJ_MAX / -17。
配置参数的代码位置
设置oom_adj参数的内核代码位置为 fs/proc/base.c,主要调用的函数是oom_adj_write
参数解析
用于调整进程的oom-killer得分,取值范围为[-1000, 1000],如果设置-1000,那么oom-killer不会选择该进程,oom-killer在计算进程得分时将其得分值设置为LONG_MIN。见函数oom_badness()。
取值 | 描述 |
[-1000, 10000] | 用于调整进程oom-killer得分,具体见OOM得分计算的算法一节。 |
配置参数代码位置
设置oom_score_adj参数的内核代码位置为fs/proc/base.c,函数名为oom_score_adj_write。
配置路径为/proc/
得分越高,优先级越高。
计算进程OOM得分的内核源码在mm/oom_kill.c的oom_badness函数中。主要流程如下:
/proc/sys/vm系统配置文档:Documemtation/admin-guide/sysctl/vm.rst
proc系统配置文档:Documentation/filesystems/proc.rst
Linux vm运行参数之(二):OOM相关的参数:
Linux OOM killer:Linux OOM killer(转)_howe8888的博客-CSDN博客_linux oom-killer
Linux之OOM简述:https://www.modb.pro/db/25143