Docker中无“虚拟内存交换比例”参数,实际通过--memory和--memory-swap联合控制:后者减前者即为可用swap量,且必须同时设置、swap≥memory;宿主机需启用swap分区才能生效。

在 Docker 中,并不存在“虚拟内存交换比例”这个独立可调参数。实际能配置的是容器可用的物理内存上限和内存 + swap 总量上限,二者共同决定了容器最多能用多少 swap 空间——而 swap 用量本身是内核按需自动调度的,不是按“比例”分配的。
关键:理解 --memory 和 --memory-swap 的真实含义
这两个参数必须成对使用,且逻辑固定:
-
--memory(如
-m 512m):限制容器能使用的最大物理内存(RSS + page cache 等用户态内存) -
--memory-swap(如
--memory-swap=1g):限制容器能使用的物理内存 + swap 总量 - 因此,真正可被换出到磁盘的 swap 空间 =
--memory-swap−--memory - swap 值不能小于 memory 值;设为相等(如都为 512m)即禁用 swap;设为 -1 表示 swap 不限(仅限物理内存受控)
如何通过 swap 配置提升资源利用率
合理启用 swap 可让内存峰值短暂超限的容器继续运行,避免被 OOM Killer 立即终止,从而提升整体资源弹性。但前提是宿主机已启用 swap 分区:
- 先确认宿主机 swap 已启用:
swapon --show,若无输出,需先创建并激活 swap 文件(如fallocate -l 2G /swapfile && mkswap /swapfile && swapon /swapfile) - 启动容器时显式指定组合值,例如:
docker run -d --name app --memory=1g --memory-swap=2g nginx:alpine
→ 容器最多用 1GB 物理内存,超出部分最多换出 1GB 到 swap - 对延迟敏感服务(如数据库、实时 API),建议禁用 swap(
--memory-swap=1g与--memory=1g相同),防止换页引入不可控延迟 - 对批处理、Jupyter Notebook、Spark Driver 等偶发内存尖峰的场景,可配置 1:1 或 1:2 的 memory:swap 比例(如 2G 内存 + 2G swap),平衡稳定性与成本
验证 swap 是否真正生效
不要只看命令是否执行成功,要查实际限制和使用:
- 进容器检查 cgroup 设置:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes(应为 1073741824 = 1G)cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes(应为 2147483648 = 2G) - 在宿主机运行:
docker stats app --no-stream,观察 “MEM USAGE / LIMIT” 后括号中是否显示 swap 用量(如812MiB / 2GiB) - 若宿主机无 swap,即使设了
--memory-swap=2g,容器也无法换出,OOM 时仍直接被 kill


















