直接查容器退出原因和内存使用峰值可快速确认oomkilled:用docker inspect或kubectl describe检查oomkilled字段,docker stats实时排序内存占用,结合dmesg日志定位时间点,集成脚本实现2秒内锁定目标容器。
直接查容器退出原因和内存使用峰值,比翻日志快得多。
一步确认是否 OOMKilled
对单个容器快速验证:
-
docker inspect 容器ID | grep -i oom —— 输出
OOMKilled: true即实锤 - Kubernetes 环境用:kubectl describe pod POD_NAME | grep -A 5 "Last State",看 reason 字段
- 批量检查运行中容器:docker ps -q | xargs -n1 docker inspect 2>/dev/null | grep -B5 "OOMKilled.*true"
实时抓取内存占用 Top 容器
不等告警触发,主动发现“吃内存大户”:
- docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}" | sort -k3 -hr | head -10 —— 按内存使用率倒序,秒级出结果
- 加过滤更精准:docker stats --no-stream --format '{{.Name}},{{.MemPerc}},{{.MemUsage}}' | awk -F, '$2 > 90 {print $0}'(筛选超 90% 的容器)
- 配合 cgroup 数据验证:cat /sys/fs/cgroup/memory/docker/*/memory.usage_in_bytes 2>/dev/null | sort -nr | head -3
自动关联 OOM 时间点与容器行为
把内核日志、容器事件、资源快照串起来:
- 提取最近一次 OOM 时间:timestamp=$(dmesg -T | grep -i "out of memory" | tail -1 | cut -d']' -f1 | sed 's/^\[ *//')
- 查该时刻前后 2 分钟内退出的容器:docker ps -a --since "$timestamp-120s" --until "$timestamp+120s" --format "{{.Names}}\t{{.Status}}" | grep "Exited"
- 一键打包证据:tar -czf oom-context-$(date +%s).tar.gz /var/log/kern.log $(find /var/log/journal -name "*.journal" -mmin -5 2>/dev/null)
集成进巡检脚本的实用逻辑
一个轻量但有效的 shell 脚本骨架:
- 每 30 秒轮询
docker stats --no-stream,内存 >85% 且持续 3 次就触发告警 - 监听
dmesg -w流,匹配到 “Out of memory” 立即执行上述容器快照 + 退出状态检查 - 输出结构化结果:容器名、OOM 时间、内存限制、实际用量、PID、对应宿主机进程名(
ps -p $(cat /proc/$(pgrep -f containerd-shim)/cgroup | head -1 | cut -d: -f3) -o comm= 2>/dev/null)
不需要等故障发生再手忙脚乱,把这四步写成定时任务或事件驱动脚本,就能在 OOM 刚发生时 2 秒内锁定目标容器。











