paused状态不触发swap,但宿主机高swap负载会加剧unpause后响应延迟;需禁用容器swap、调低swappiness、预留内存缓冲以避免假卡顿。
paused 状态本身不会触发内存交换(swap),但宿主机全局 swap 活跃会加剧 paused 容器恢复后的响应延迟——因为其冻结期间积累的脏页、未刷盘数据和内核缓存状态,在 unpause 后需密集参与内存重调度与 swap 页面换入,造成“假卡顿”。真正的问题不在 paused 容器主动使用 swap,而在于宿主机 swap 高负载削弱了整个系统的内存响应能力。
确认宿主机是否正在频繁使用 swap
执行以下命令快速判断:
-
查看 swap 使用总量与活跃度:
free -h关注Swap行的used和%列;若used> 512MB 且%> 30%,说明 swap 已介入工作 -
检查页面换入换出频率:
vmstat 1 5观察si(swap-in)和so(swap-out)列,持续 > 100 KB/s 即属异常 -
定位哪些进程在触发 swap:
sudo smapstool | grep -A5 "Swap:" | sort -k2 -nr | head -10(需先安装smapstool)或用cat /proc/[pid]/status | grep VmSwap手动排查高 Swap 使用进程
禁止容器使用 swap 并限制内存上限
即使容器处于 Paused 状态,其 cgroup 内存控制器仍保留配额信息。若未显式禁用 swap,unpause 后可能因内存压力被迫换页。务必在启动时关闭 swap 分配:
- 使用
--memory-swap与--memory设为相同值,即完全禁用 swap:--memory=512m --memory-swap=512m - 更安全的做法是设为
--memory-swap=-1,表示“不允许使用任何 swap”,即使宿主机启用 swap,该容器也无法分配 - 示例:
docker run -d --name db --memory=1g --memory-swap=-1 --cpus=2 postgres:14
降低宿主机 swap 倾向性(swappiness)
Linux 默认 vm.swappiness=60,意味着内核较积极地将匿名页换出。对 Docker 主机应大幅调低:
- 临时生效:
sudo sysctl vm.swappiness=10 - 永久生效:在
/etc/sysctl.conf中添加vm.swappiness=10,然后运行sudo sysctl -p - 数值建议:生产环境推荐设为
1–10;若宿主机内存充足(如 ≥32GB 且容器总内存限制 ≤70%),可设为1,几乎不触发 swap
避免在 Paused 前让容器内存接近上限
Paused 容器虽不运行,但其已分配的内存仍被锁定在 RAM 中(cgroup memory.current 不降)。若 pause 前内存已逼近 --memory 限额,宿主机在其他负载上升时更容易触发整体 swap —— 这会拖慢所有进程,包括后续 docker unpause 的调度速度:
- 监控关键容器的内存余量:
docker stats --no-stream --format "table {{.Name}}\t{{.MemPerc}}\t{{.MemUsage}}" | grep -v "0.00%" - 对长期运行的服务(如数据库),设置内存限制时预留 15–20% 缓冲,例如应用常驻 800MB,则设
--memory=1g而非--memory=850m - 配合
--oom-kill-disable=false(默认)+ 合理 limit,让 OOM Killer 在真正超限时快速清理,而非陷入 swap 拖累全局











