夜雨聆风学习资料网

ARTICLE · 1136875

Linux 6.12 源码深度剖析: out_of_memory

Linux 6.12 源码深度剖析: out_of_memory

系统内存见底时,Linux 会启动 OOM Killer。它负责挑个进程杀掉,把内存腾出来。

这事儿不是上来就动手。内核先问驱动和子系统,看能不能紧急挤点缓存出来。要是当前进程正准备退出,就直接收割它。遇到某些底层分配场景,宁可暂缓也不乱杀,怕的是引发死锁。

真要动手也有讲究。开了快速通道,谁触发就杀谁,省得遍历进程表费 CPU。默认走慢速通道,按内存占用算分,挑最该死的那个下手。要是扫了一圈全是杀不掉的,干脆让内核 panic,免得半死不活把数据搞坏。

这套机制牵扯到缺页处理、块设备驱动和进程调度等各种机制、业务场景。但真正坑人的是下面这些翻车现场:

有次存储节点突然大面积卡死,CPU 飙满却没任何 OOM 日志。查半天发现,内核陷入了死循环:因为缺少特定标志位,OOM Killer 直接返回却不杀进程。分配失败又重试,越试越失败,最后只能靠配置强制 panic 来救场。

还有次容器平台频繁崩溃。明明开了快速通道想省 CPU,结果杀的全是刚启动的小进程。真正的 Java 内存大户毫发无损,继续膨胀。后来才发现,是快速通道在 cgroup 环境下根本认不清谁是真凶。

原文Linux 6.12 源码深度剖析: out_of_memory
作者提示: 个人观点,仅供参考
四川,2小时前,

相关学习资料