首页/云/Docker 容器速查/确认容器是否被 OOM 杀死
容器排障52 条

确认容器是否被 OOM 杀死

OOMKilled 字段是判定关键:State.OOMKilled=true 表示容器内存超限被内核杀掉,退出码通常为 137,但 137 不等于必然 OOM。

Docker 容器速查云更新于 2026-10-13

判定思路

容器被内核因内存超限杀掉时,Docker 会把 State.OOMKilled 置为 true,退出码通常是 137。反过来并不成立:137 也可能来自停止超时后的强制杀,或其他直接收到该信号的场景。因此判定要组合多条证据:inspect 的字段、docker events 的 oom 事件、宿主 dmesg 里的记录,以及容器当时的内存限额。

基本信息

判定关键字docker inspect 的 State.OOMKilled
联动证据ExitCode 137 与 docker events 的 oom 事件
宿主证据dmesg 中的 killed process 与内存统计
限额字段HostConfig.Memory,为 0 表示未设置上限
适用平台Linux 宿主上的 Docker Engine

典型使用场景

  • 服务周期性退出且日志没有异常堆栈,怀疑被内核杀掉
  • 调整内存限额后验证问题是否消失
  • 排查退出码 137 到底是内存超限还是停止超时
  • 结合内存曲线定位是谁在持续涨内存
  • 把 OOM 事件接入告警,缩短发现时间

取证命令

取证命令
docker inspect -f 'oom={{.State.OOMKilled}} exit={{.State.ExitCode}} mem={{.HostConfig.Memory}}' web
docker events --since 2h --filter event=oom            # 事件流里的 oom 记录
dmesg -T | grep -i -E 'killed process|oom' | tail -10  # 宿主内核日志
docker stats --no-stream web                           # 当前内存占用与限额对照

证据逐项读法

字段 / 命令含义判读
State.OOMKilled是否因内存超限被杀true 是直接证据
State.ExitCode容器退出码137 常见但不唯一,需交叉验证
HostConfig.Memory内存限额0 表示没有设置上限
events 中的 oom事件流记录时间点可与应用日志对齐
dmesg 输出内核层面记录包含被杀进程与内存统计
容器 OOM 是结果不是原因:要结合内存曲线、容器内进程与请求量变化,找出是谁在持续涨内存。
没有设置内存上限时,容器可能被宿主级内存压力波及,此时容器侧字段未必置位,需要结合 dmesg 与宿主日志判断。
限额单位容易写错:--memory=512m 表示 512MiB,写成 512 会被当成很小的字节量,与预期相差极大。

易错点

  • 只看到 137 就断定是 OOM:停止超时后的强制杀同样产生该退出码,需用 OOMKilled 与 dmesg 交叉确认
  • 调限额前不看内存峰值:把上限调大只是掩盖泄漏,问题会以更晚、更严重的形式复现
  • 忽略宿主级 OOM:未设限额的容器被整体内存压力波及,容器级字段不会置位
  • 应用堆参数与容器限额不匹配:运行时堆上限高于容器限额,进程必然被杀,且日志中看不到明显异常
  • 只看容器内日志:OOM 时应用往往来不及落盘,必须查内核与事件证据

数据来源与参考

  • Docker 官方文档:Out Of Memory 与 docker inspect State(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌