游戏卡顿白皮书 › L7 服务器操作系统(内核)
OOM Killer Out-of-memory killer
原因 ID so-oom · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
Linux 在内存耗尽时,会挑出占用内存最多的进程强制杀掉,通常就是游戏服务器。
起因 泄漏或暴增导致内存耗尽,或者达到容器内存上限 → 结果 内核强制终止游戏服务器进程 → 画面表现 这台服务器上的所有人同时掉线,最近的进度可能回档
- 症状
- 掉线, 吞操作/回档
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 开得越久越严重, 人多的时候
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
- 研发团队要做的事
- 修复泄漏;设定内存使用上限,并做好接近上限时先存盘再正常关闭的流程。
- 运维团队要做的事
- 设置内存告警;按实际用量设置容器内存上限;调整优先杀掉的顺序(oom_score_adj)。
- 数值参考
- 内核日志(dmesg)里会留下“Out of memory: Killed process”,在 Kubernetes 中显示为 OOMKilled。Windows 没有 OOM Killer,服务器多半是因内存分配失败而报错退出。
- 监控图上
- 连接成批断开 · 连接数、内存使用量
- 查看位置
- 把 dmesg 中的“Out of memory: Killed process”记录、Kubernetes Pod 状态里的 OOMKilled、cgroup v2 下 memory.events 中 oom_kill 的增加,与掉线时刻对照
- 确认依据
- 连接集中断开的时刻有游戏服务器进程被杀的记录,且在那之前内存使用量一路涨到上限
- 排除依据
- 没有 OOM 记录而进程死了,看“服务器崩溃”的崩溃日志和 core dump
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- mm/oom_kill.c (Linux v6.12) Linux kernel
计算时让占用内存最多的进程得分最高(计入 oom_score_adj);终止时记录“Out of memory: Killed process …” - Assign Memory Resources to Containers and Pods Kubernetes
容器持续使用超过内存 limit 时会被终止,状态显示为 OOMKilled - Pushing the Limits of Windows: Virtual Memory Microsoft
Windows 达到提交上限(commit limit)时,提交内存的分配会失败,可能导致应用出错或系统故障 - Control Group v2 Linux kernel
memory.events 的 oom_kill:这个 cgroup 中被 OOM Killer 杀掉的进程数
相关原因
同一层:L7 服务器操作系统(内核)
其他层中同样导致“掉线”的原因
查看含图示和实验的原卡片