容器exited with code 137定位(进程被kernel killed)

问题

容器进程有重启的情况,根据dmes -T 看到oom

[Wed Oct 15 17:30:32 2025] Tasks state (memory values in pages): [Wed Oct 15 17:30:32 2025] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name [Wed Oct 15 17:30:32 2025] [3440962] 0 3440962 1117322 1049188 8531968 0 0 python [Wed Oct 15 17:30:32 2025] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-6bb2f6b062b35ee72a4e4f888cfec38622578d06d2b07edc93f1031799be5630.scope,mems_allowed=0,oom_memcg=/system.slice/docker-

退出码 137 = 被系统强制 kill(SIGKILL 9号信号),最常见的原因是:
容器 OOM(内存溢出被内核 OOM Killer 杀死)

解决

这段日志非常典型,是 Docker 容器因内存不足 (OOMKilled) 被系统内核强制杀死的完整过程。


1.核心关键信息提炼

Memory cgroup out of memory: Killed process 3439793 (python)
total-vm:4468264kB, anon-rss:4184116kB

说明:

  • 容器内的 Python 进程占用了约 **4.18 GB 实际内存 (RSS)**;
  • 容器所在的 cgroup memory 限制为 4 GB
  • 因为超限,触发 OOM Killer,将该 Python 进程 kill 掉。

2.触发 OOM 的根因

日志末尾清楚说明:

memory: usage 4194304kB, limit 4194304kB, failcnt 36
swap: usage 0kB, limit 4194304kB, failcnt 0

👉 容器内存上限 = 4GB(4194304KB)

  • 使用达到上限;
  • swap 未启用;
  • OOM 被触发。

3.从内核栈看触发点

python invoked oom-killer
mem_cgroup_out_of_memory
try_charge_memcg
do_anonymous_page

这表示:

  • Python 进程在分配新的匿名页(堆内存,如 NumPy / 大数据结构)时;
  • mem_cgroup 检测超出容器 memory 限制;
  • 触发 oom-killer
  • 被强制 kill。

解决建议

1. 提高容器内存限制

1
2
3
docker run -m 8g --memory-swap 8g ...
# 或者在 docker-compose.yml 中:
mem_limit: 8g

Kubernetes:

1
2
3
4
5
resources:
limits:
memory: 8Gi
requests:
memory: 4Gi

2.分析代码优化内存申请释放