防范宿主机假死的关键是成对设置--memory和--memory-swap以划定“内存+Swap”总边界:--memory=1g --memory-swap=1g禁用swap并快速OOM止损,--memory=1g --memory-swap=2g允许1GB swap仅适用于批处理,--memory-swap=-1绝对禁止;宿主机必须启用swap且内核支持cgroup swap控制,否则配置无效。

防范宿主机内核假死,关键不是让容器多用 Swap,而是用 --memory 和 --memory-swap 联合划清“内存 + Swap”总边界,防止容器耗尽宿主机全部物理内存和 Swap 后触发 OOM Killer 杀掉 SSH、systemd、klogd 等关键进程。
必须成对设置 memory 与 memory-swap
这两个参数硬绑定,单独设 --memory-swap 会报错:“--memory-swap requires --memory to be set”。实际可用 Swap = --memory-swap − --memory,该差值必须 ≥ 0:
-
--memory=1g --memory-swap=1g:Swap = 0,超限立即 OOM,快速止损(推荐生产环境) -
--memory=1g --memory-swap=2g:最多用 1GB 内存 + 1GB Swap,总上限 2GB(仅适用于可容忍延迟的批处理) -
--memory=1g --memory-swap=-1:Swap 不设上限,极易拖垮宿主机,生产环境绝对禁止
宿主机 Swap 必须真实启用且可用
容器能否换出内存,完全取决于宿主机。若宿主机没 Swap,即使你配置了 --memory-swap=2g,容器也只会按 --memory=1g 运行,超出即被杀,Swap 配置形同虚设:
- 运行
swapon --show,确认有活跃 swap 分区或 swapfile - 若无,可快速创建:
sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile - 建议 swap 容量为物理内存的 50%–100%,但单个容器的
--memory-swap不应超过宿主机 swap 总量的 70%
内核必须支持 cgroup swap 控制
很多云主机、精简系统或旧内核默认禁用该功能,导致配置静默失效:
- 检查是否启用:
ls /sys/fs/cgroup/memory/中是否存在memory.memsw.limit_in_bytes(cgroups v1)或memory.swap.max(cgroups v2) - 如不支持,需修改
/etc/default/grub,添加:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1",再执行sudo update-grub && sudo reboot - Ubuntu 22.04+/CentOS 8+ 通常默认开启;Docker Desktop for Mac(Intel)等开发环境也需确认内核参数生效
验证配置是否真正落地到内核
别只信 docker run 命令成功,要查 cgroup 层级限制:
- 进容器执行:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes→ 应等于--memory字节数(如 1g = 1073741824) - 进容器执行:
cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes(v1)或cat /sys/fs/cgroup/memory/memory.swap.max(v2)→ 应等于--memory-swap字节数 - 在宿主机运行:
docker inspect 容器名 | jq '.[0].HostConfig.MemorySwap',输出值应与设定一致


















