防止宿主机夯死的关键是成对设置--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 等关键进程。
这两个参数是硬绑定的,缺一不可:
--memory-swap 会报错:--memory-swap requires --memory to be set --memory-swap 值必须 ≥ --memory,差值即为容器实际可用 swap 容量 --memory-swap − --memory(结果必须 ≥ 0)常见有效组合:
--memory=1g --memory-swap=1g → swap = 0,超限立即 OOM,快速止损(推荐生产环境) --memory=1g --memory-swap=2g → 最多用 1GB 物理内存 + 1GB swap(仅适用于可容忍延迟的批处理) --memory=1g --memory-swap=-1 → swap 不设上限,极易拖垮宿主机,生产环境绝对禁止
容器能否换出内存,完全取决于宿主机:
swapon --show,确认有活跃 swap 分区或 swapfile sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
--memory-swap 不应超过宿主机 swap 总量的 70%很多云主机或精简系统默认禁用该功能,导致配置静默失效:
ls /sys/fs/cgroup/memory/ | grep memsw(应有 memory.memsw.limit_in_bytes) ls /sys/fs/cgroup/ | grep swap(应有 memory.swap.max) /etc/default/grub: GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
然后执行 sudo update-grub && sudo reboot
别只信 docker run 成功,要查内核级限制:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes # 应等于 --memory 字节数 cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes # 应等于 --memory-swap 字节数
docker stats <容器名> --no-stream 查看 “MEM USAGE / LIMIT”,括号中显示的是 memory + swap 总用量不复杂但容易忽略