한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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
确认手段
运维工具即可确认(无需游戏代码)

出处

  1. mm/oom_kill.c (Linux v6.12) Linux kernel
    计算时让占用内存最多的进程得分最高(计入 oom_score_adj);终止时记录“Out of memory: Killed process …”
  2. Assign Memory Resources to Containers and Pods Kubernetes
    容器持续使用超过内存 limit 时会被终止,状态显示为 OOMKilled
  3. Pushing the Limits of Windows: Virtual Memory Microsoft
    Windows 达到提交上限(commit limit)时,提交内存的分配会失败,可能导致应用出错或系统故障
  4. Control Group v2 Linux kernel
    memory.events 的 oom_kill:这个 cgroup 中被 OOM Killer 杀掉的进程数

相关原因

同一层:L7 服务器操作系统(内核)

其他层中同样导致“掉线”的原因

查看含图示和实验的原卡片