linux的斩杀线之OOM操控

什么是OOM

对于操作系统来说,为了维护自身的稳定,有一个"物理斩杀"的机制,即OOM机制。OOM会在操作系统的内存资源不足时,选择特定的进程直接斩杀(kill),以此来释放内存,保证系统可以正常运行。

OOM系统参数简单说明

  1. panic_on_oom
  • 修改位置:sysctl修改vm.panic_on_oom

  • 功能说明:

  • 0 :内存不足时,触发OOM Killer(默认值)

  • 1 :内存不足时,根据具体情况可能发生kernel panic,也可能触发OOM killer

  • 2 :内存不足时,强制触发系统panic,导致系统重启

  1. oom_kill_allocating_task
  • 修改位置:sysctl修改vm.oom_kill_allocating_task

  • 功能说明:

  • 0 :选择oom_score得分最高的进程(默认值)

  • 非0:选择触发OOM的进程

  1. oom_dump_tasks
  • 修改位置:sysctl修改vm.oom_dump_tasks

  • 功能说明:

  • 0 :OOM发生时不会打印相关信息

  • 非0:以下三种情况会调用dump_tasks打印系统中所有task的内存状况。(默认值1)

  • 由于OOM导致kernel panic。

  • 没有找到需要结束的进程。

  • 找到进程并将其结束的时候

  1. oom_score
  • 修改位置:echo 1000 > /proc/<pid>/oom_score_adj

  • 功能说明:

  • 0 :不调整oom_score(默认值)

  • 负值:在实际打分值上减去一个折扣(若设定成OOM_SCORE_ADJ_MIN或-1000,则表示禁止OOM killer结束该进程)

  • 正值:增加该进程的oom_score

  1. cgroup优先级配置

  2. cgroup的内存节点设置

OOM触发条件说明

  1. cgroup内存不足:

使用的内存超出了cgroup中memory.limit_in_bytes配置的大小

  • 示例:cgroup的limit_in_bytes设置80M,实际使用超过80M
  1. 父cgroup内存不足:

在子cgroup中内存仍然足够,但是父cgroup的内存不足,超过了内存限制(父进程的memory.limit_in_bytes)

  • 示例:父进程cgroup的limit_in_bytes设置80M,两个子进程的cgroup的limit_in_bytes分别设置50M
  1. 系统全局内存不足

方面由于OS的空闲内存不足,有程序一直在申请内存,另一方面也无法通过内存回收机制解决内存不足的问题,因此触发了OOM

  1. 内存节点(Node)的内存不足

在NUMA存储模式下,OS会存在多个内存节点,如果程序指定使用特定节点的内存,可能在OS内存充足的情况下触发OOM

  1. 其他可能原因

OS在内存分配的过程中,如果伙伴系统的内存不足,则系统会通过OOM Killer释放内存,并将内存提供至伙伴系统

解决方案

  1. 从业务进程排查,确认是否有内存泄漏,导致OOM。

  2. 排查cgroup limit_in_bytes配置是否与业务内存规划匹配,如需要调整,可以手动执行以下命令修改配置参数:

echo <value> > /sys/fs/cgroup/memory/<cgroup_name>/memory.limit_in_bytes

  1. 如果确认业务需要比较多的内存,建议升级弹性云服务器内存规格。

  2. 调整系统内核参数

总结

对于OOM,我们可以通过多个角度来实现细粒度的控制。

|--------------------------|------------------------------------------------------------------------------------|------------------------------------------------|
| 方式 | 说明 | 设置内容 |
| cgroup | cg组优先级设置,进程挂在组下受优先级影响 | cgroup的memory.use_priority_oom和memory.priority |
| cgroup | cg组内存绑定策略设置,进程挂载组下受内存绑定策略影响 | cgroup中的cpuset下的cpuset.mems |
| oom_score_adj | 进程得分调整接口,可以设置永不kill 或 靠影响得分间接影响oom顺序 | /proc/\<pid\>/oom_score_adj |
| memory policy | 内存绑定策略调整。对于"bind"或"interleave"策略,检查掩码与策略节点掩码是否存在交集。对于"perferred"或"local"策略,始终认为有交集 | numactl -m / set_memory_policy |
| oom_kill_allocating_task | 选择kill触发者,还是受害者 | vm.oom_kill_allocating_task |

相关推荐
Apipi*7 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
天启HTTP7 小时前
爬虫防封核心原理:IP轮换机制与风控规避逻辑
linux·服务器·网络·爬虫·tcp/ip
广州浮点FLOATLIC10 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
BLUcoding10 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK10 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil20810 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)10 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter62511 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida12 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
zly350013 小时前
centos7 mount设备挂载 /dev/sda1/硬盘挂载
linux·运维·服务器