防止系统假死的关键是成对设置--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 与 memory-swap
这两个参数是硬绑定关系:
- --memory=1g --memory-swap=1g:物理内存上限 1GB,Swap 为 0,超限立即 OOM,快速止损(推荐生产环境)
- --memory=1g --memory-swap=2g:最多用 1GB 物理内存 + 1GB Swap,总上限 2GB(仅适用于可容忍延迟的批处理任务)
- --memory=1g --memory-swap=-1:物理内存限 1GB,但 Swap 不设上限——极易拖垮宿主机,绝对禁止在生产环境使用
- 单独写
--memory-swap=2g会报错:“--memory-swap requires --memory to be set”
宿主机 Swap 必须真实可用
容器能否换出内存,完全取决于宿主机:
- 运行
swapon --show,确认有活跃 swap 分区或 swapfile - 若无,先创建(例如):
sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile - 若宿主机没 Swap,即使你设了
--memory-swap=2g,容器也只会按--memory=1g硬限运行,超出即被杀,Swap 配置形同虚设
确保内核支持 cgroup Swap 控制
很多云主机或精简镜像默认禁用该功能,导致配置静默失效:
- 检查是否启用:
ls /sys/fs/cgroup/memory/存在且含memory.memsw.limit_in_bytes - 如不支持,需修改
/etc/default/grub,添加:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
然后执行sudo update-grub && sudo reboot - Ubuntu 22.04+/CentOS 8+ 通常默认开启;旧版内核或定制系统需手动确认
验证配置是否真正落地
别只信 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” 后括号里的数值,LIMIT 是 memory + swap 总和











