首页/云/Kubernetes 速查/OOMKilled:容器内存超限被杀
调度与资源52 条

OOMKilled:容器内存超限被杀

退出码 137 且 lastState 显示 OOMKilled,表示容器内存超过 limit 被内核杀掉;须先区分容器级超限与节点级内存枯竭。

Kubernetes 速查云更新于 2026-10-13

OOMKilled 是什么

OOMKilled 表示容器的内存用量超过了它自己的上限,被内核强制终止。现象是容器退出码为 137,容器状态里上一次终止的原因显示为内存不足,重启计数随之增加。这类终止发生在容器级别,与节点整体是否紧张无关,即使节点剩余内存很多也会发生。

还有一种内存相关的终止

节点内存整体紧张时,系统会按服务质量等级排序驱逐 Pod,或者触发系统级的内存终止。这种情况事件里会写明是因为节点内存不足被驱逐,Pod 状态也往往是终止而非重启。两者处置方向完全不同:一个是调容器上限与程序内存,一个是给节点扩容或降低其他负载。

基本信息

适用环境任何 Kubernetes 发行版,由容器运行时与内核 cgroup 机制产生
典型退出码137,即 128 加 9,对应强制终止信号
判定依据容器上一次终止状态里的原因字段
触发条件容器内存用量超过声明的上限
与节点的关系节点内存充足时同样会发生,属于容器级限制
常见诱因上限过低、堆外内存未计入、瞬时峰值超预期

典型使用场景

  • 排查周期性重启:容器每隔一段时间重启且退出码为 137,优先怀疑内存超限
  • 核对上限设置:确认声明值是否低于程序真实工作集
  • 发布后异常:新版本内存占用上升,旧上限不再够用
  • 缓存类服务调优:缓存规模随数据量增长,需要重新评估上限
  • 排查大查询:个别请求触发大量内存分配,瞬时超过上限
  • 验证修复效果:调整上限或优化程序后确认重启计数不再增长

确认与取证

确认与取证
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].lastState}'   # 看上一次次态
kubectl describe pod web-x | sed -n '/Last State/,+4p'      # 退出码与原因
kubectl logs web-x --previous --tail=100                     # 被杀前的最后输出
kubectl top pod web-x --containers                            # 当前各容器用量
grep -i oom /var/log/messages 2>/dev/null || journalctl -k | grep -i oom   # 节点侧内核记录(在节点上执行)

两类内存终止的区分

维度容器级超限节点级枯竭
触发点容器用量超过自身上限节点可分配内存低于阈值
现象容器被杀并重启,退出码 137Pod 被驱逐或触发系统级终止
事件线索上一次终止原因为内存不足事件中出现因为节点内存不足被驱逐
处置方向调整上限或优化程序内存占用扩容节点或降低其他负载
只调大上限可能只是把问题推后:先确认内存增长是正常负载还是泄漏,再决定调参还是修代码。
带虚拟机或解释型运行时的应用,堆外内存与运行时自身开销都计入容器内存,只按堆大小设置上限容易持续触发终止。

易错点

  • 只看当前实例状态:容器的上一次终止信息才记录真正的退出原因,当前状态可能已经恢复正常
  • 把 137 一律当作内存问题:探针失败后的强制终止同样是这个退出码,需要结合原因与事件区分
  • 只按堆大小设置上限:运行时开销与堆外内存都要计入,否则会周期性被杀
  • 忽略被杀前的日志:崩溃前往往已有明显的内存告警或异常分配线索,先取证再调参能省掉多轮试错

数据来源与参考

  • Kubernetes 官方文档 · Pod 故障排查(OOMKilled)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌