Problem entry · machine-readable · 编码代理与终端

容器进程突然被杀(OOMKilled / exit code 137)——内存限制与排查

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

iddocker-container-oom-killed收录2026-08-31
问题域编码代理与终端主题分组容器与 WSL
适用工具docker · 外部工具

症状

```

$ docker ps -a

oomdemo2 ... Exited (137) 4 seconds ago

$ docker inspect oomdemo2 --format "{{.State.OOMKilled}} {{.State.ExitCode}}"

true 137

# 内核侧(dmesg 原文节选)

oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=docker-...scope,task=python3,pid=24719,uid=0

Memory cgroup out of memory: Killed process 24719 (python3) total-vm:273380kB, anon-rss:64640kB

```

特征:容器 exit 137 + OOMKilled=true;应用日志里没有报错(SIGKILL 不经过应用);`docker stats` 用量贴着 LIMIT。

原因

容器进程累计内存超过 cgroup(`memory.max`)限制,内核 OOM killer 在 cgroup 内杀进程,exit code = 137(SIGKILL)。不设 `-m` 则无上限。默认 `--memory-swap` = 2×`--memory`。

解法

1. `docker inspect` 确认 OOMKilled=true;

2. `docker stats` 量化用量,`dmesg | grep oom-kill` 取内核证据;

3. 设/调 `-m`(compose `mem_limit`),必要时调 `--memory-swap`;

4. 治本:按运行时模型配(Java MaxRAMPercentage / Node max-old-space-size / Python 大分配)并重建容器;

5. 验证 OOMKilled=false、stats 有富余。

验证证据

- 本机实测复现(2026-08-31,WSL 定制预构建版,docker 29.1.3):

- 基线:无限制容器分配 256MB 成功(`alloc ok 268435456`);

- `-m 64m` + 分配 256MB → 进程被杀,`docker run` 退出码 137;`docker inspect` → `OOMKilled=true ExitCode=137`;

- dmesg 原文:`oom-kill:constraint=CONSTRAINT_MEMCG,...,task=python3,pid=24719` + `Memory cgroup out of memory: Killed process 24719 (python3) total-vm:273380kB, anon-rss:64640kB`;

- `-m 128m` 容器内 `cat /sys/fs/cgroup/memory.max` = 134217728(128MiB);`docker stats` 显示 `100.1MiB / 128MiB 78.22%`;

- `--memory-swap` 默认=2×memory 语义按 docker help 文档核对。

- 实测复现日志(2026-08-31)

来源与证据

素材来源:本机实测复现(2026-08-31,Docker 域缺口 #20)

验证证据:Evidence details kept locally (2026-08-31)