--memory-swap 的语义
--memory-swap 控制内存加交换空间的总量,语义是总量而不是单独的交换量:把它设成与 --memory 相同即禁用交换,不设置时默认允许使用与内存等量的交换。延迟敏感服务通常禁用交换,批处理类可以保留交换以提升内存利用率。
基本信息
| 语义 | memory-swap = 内存 + 交换 的总上限 |
|---|---|
| 禁用交换 | --memory-swap 与 --memory 取相同值 |
| 默认行为 | 未设置时允许等量交换 |
| 特殊值 | -1 表示不限制交换用量 |
| 核对 | docker inspect 的 HostConfig.MemorySwap |
典型使用场景
- 延迟敏感服务:禁用交换,避免换入换出带来的抖动
- 批处理任务:保留交换,提高内存利用率而不必预留大内存
- 容量受限的宿主:限制总量避免单个容器把交换吃满
- 稳定性验证:确认交换参数与宿主交换配置的组合行为
- 迁移老业务:把宿主的交换策略对齐到容器编排里
禁用与保留交换
禁用与保留交换
# 禁用交换:内存与总量都设 512m
docker run -d --memory=512m --memory-swap=512m --name no-swap app/api:1.4.2
# 允许 512m 内存加 512m 交换
docker run -d --memory=512m --memory-swap=1g --name with-swap app/api:1.4.2
docker inspect -f '{{.HostConfig.Memory}}/{{.HostConfig.MemorySwap}}' with-swap参数组合对照
| 场景 | 参数组合 | 效果 |
|---|---|---|
| 禁用交换 | memory-swap 等于 memory | 不会换出到磁盘 |
| 允许等量交换 | 只设 memory | 最多可用等量交换 |
| 留出额外交换 | memory-swap 大于 memory | 总量等于两者之和 |
| 不限制交换 | memory-swap=-1 | 特殊场景才用 |
总量写小于内存会被拒绝(-1 除外),配置前先把总量算清楚再写进编排。
宿主交换空间不足时容器仍会被 OOM,交换参数不等于额外的物理内存,容量规划不能依赖它。
延迟敏感服务通常禁用交换以避免抖动;批处理类保留交换往往能提高利用率,选型取决于业务对延迟的容忍度。
宿主的交换策略与 cgroup 版本都会影响实际行为,改动后要观察一段真实负载再下结论,不要只看压测瞬间的表现。
交换参数与内存软限、OOM 优先级共同决定压力下的表现,单独调一个参数很难得到预期结果。