一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何配置 --memory-swap 限制容器交换分区避免宿主机夯死

时间:2026-07-26 08:33:48 编辑:袖梨 来源:一聚教程网

防止宿主机夯死的关键是成对设置--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-swap 会报错:--memory-swap requires --memory to be set
  • --memory-swap 值必须 ≥ --memory,差值即为容器实际可用 swap 容量
  • 实际可用 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 不设上限,极易拖垮宿主机,生产环境绝对禁止

宿主机必须真实启用 swap

容器能否换出内存,完全取决于宿主机:

  • 运行 swapon --show,确认有活跃 swap 分区或 swapfile
  • 若无输出,需手动创建并启用(例如):
    sudo fallocate -l 2G /swapfile  sudo chmod 600 /swapfile  sudo mkswap /swapfile  sudo swapon /swapfile
  • 建议 swap 容量为物理内存的 50%–100%,但单个容器的 --memory-swap 不应超过宿主机 swap 总量的 70%

内核必须支持 cgroup swap 控制

很多云主机或精简系统默认禁用该功能,导致配置静默失效:

  • 检查是否启用:
    • cgroups v1:ls /sys/fs/cgroup/memory/ | grep memsw(应有 memory.memsw.limit_in_bytes
    • cgroups v2: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 字节数  
  • 若两者相等,说明 swap 已禁用;若后者更大,差值即为可用 swap 容量
  • 也可用 docker stats <容器名> --no-stream 查看 “MEM USAGE / LIMIT”,括号中显示的是 memory + swap 总用量

不复杂但容易忽略

热门栏目