Linux OOM killer

介绍

OOM是out-of-memory的缩写,Linux 内核引入OOM管理机制主要是为了解决因系统内存耗尽导致内存分配失败,内核应该如何处理的问题。内核中提供了两种方式:

  1. 直接触发panic
  2. 通过杀死一些进程达到回收内存缓解系统内存压力的目的。

系统也提供了若干个配置参数选项可供选择,接下来介绍这些参数的作用以及这些参数如何影响系统的行为。

系统配置

panic_on_oom

配置所在的路径为/proc/sys/vm/panic_on_oom,不同取值对应的行为如下表所示:

取值

描述

0

系统不会触发panic

1

系统有可能触发panic

2

如果触发OOM,内核会panic

主要检查函数check_panic_on_oom,所在文件为mm/oom_kill.c,函数主要逻辑如下:

  1. 如果panic_on_oom值为0,不会触发panic,并返回。
  2. 如果panic_on_oom值不为2, 并且进程做了其它内存策略限制(NUMA、 CGroup、 cpuset等),不会触发panic,并返回。
  3. panic_on_oom值为2,并且是sysrq触发的检查,则不会触发panic,并返回。
  4. panic_on_oom值为2,打印OOM信息,并触发panic。

oom_dump_tasks

配置所在的路径为/proc/sys/vm/oom_dump_tasks,不同取值对应的行为如下表所示:

取值

描述

0

内核触发OOM,打印所有系统任务信息

1

内核触发OOM,不打印系统任务信息

主要流程在dump_task函数中,所在文件为mm/oom_kill.c

oom_kill_allocating_task

配置所在的路径为/proc/sys/vm/oom_kill_allocating_task,取值范围及其对应的系统行为如下表所示:

取值

描述

0

如果触发OOM,内核会检查每个进程的分数,得分最高的进程会被kill掉

1

触发OOM,内核会kill掉当前在申请内存的进程

进程配置

oom_adj

参数解析

旧的配置参数,功能与oom_score_adj类似,内核为了保持向后兼容保留了这个参数。用于调整进程OOM得分的配置,配置所在路径为/proc/<pid>/oom_adj,配置可取值如下表所示:

取值

描述

[-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_score_adj

参数解析

用于调整进程的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。

oom_score

配置路径为/proc/<pid>/oom_score,只读配置,查看当前进程的OOM得分。系统根据进程的得分高低选择可杀死的进程。

得分越高,优先级越高。

选择杀死进程的算法

计算进程OOM得分的内核源码在mm/oom_kill.c的oom_badness函数中。主要流程如下:

  1. 如果进程ID为1(即init进程)或者进程为内核线程,那么返回LONG_MIN。
  2. 如果进程的task->mm结构体为空(该进程可能正被创建或销毁),那么返回LONG_MIN。
  3. 如果进程的oom_score_adj被设置为OOM_SCORE_ADJ_MIN。
  4. 根据进程使用内存的指标(物理内存使用量、SWAP使用量和页表内存使用量)初步计算进程的OOM得分:points = mm_rss + mm_swapents + mm_pagetables
  5. 计算进程的调整OOM得分:adj = oom_score_adj * totalpages / 1000。
  6. 最终得分:points + adj。

参考资料

/proc/sys/vm系统配置文档:Documemtation/admin-guide/sysctl/vm.rst

proc系统配置文档:Documentation/filesystems/proc.rst

Linux vm运行参数之(二):OOM相关的参数:

Linux vm运行参数之(二):OOM相关的参数

Linux OOM killer:Linux OOM killer(转)_howe8888的博客-优快云博客_linux oom-killer

Linux之OOM简述:https://www.modb.pro/db/25143

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值