• 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//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//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的博客-CSDN博客_linux oom-killer

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

  • 相关阅读:
    如何进行企业数字化转型?数字化转型的3大核心规律
    Docker安装Mycat和Mysql进行水平分库分表实战【图文教学】
    iptables防火墙及filter和nat的相关操作
    ICCV2023 Tracking paper汇总(一)(多目标跟随、单目标跟随等)
    nginx实现双向认证
    深度剖析商业智能BI中的多维分析
    Java开发 - 让你少走弯路的Redis集群搭建
    【论文解析】笔触渲染生成 前沿工作梳理
    洛谷 P7018 [CERC2013] Bus
    React18原理: React核心对象之ReactElement对象和Fiber对象
  • 原文地址:https://blog.csdn.net/yongjong/article/details/126053735