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