部署 K8s 前经常会被提醒一句话:把 swap 关掉。很多人第一反应是——swap 不就是“内存不够用时的救命稻草”吗?为什么反而要禁用?

核心原因其实就两点:性能不可控和资源管理失真。

先说性能。swap 的本质是把一部分“内存里的数据”挪到磁盘上,等需要时再从磁盘换回来。问题是磁盘 I/O 再快也比内存慢得多,一旦系统压力上来、开始频繁换页,机器就会出现那种“CPU 不高但卡得要命”的状态:进程在等 I/O,延迟飙升,吞吐掉头。K8s 这边跑的又是容器工作负载,本来就很吃磁盘(镜像、日志、数据卷、OverlayFS 读写),这时候 swap 再来抢 I/O,等于给高峰期火上浇油。你想要的是稳定的集群,结果变成了“看起来还活着,但响应慢到不可用”,甚至触发连锁故障。

再说资源管理。K8s 依赖 cgroup 去做资源隔离和调度决策,尤其是内存这块:该 OOM(内存不够,系统/容器被迫杀进程自救) 就 OOM,该驱逐就驱逐,保证系统整体可预期。但如果开着 swap,节点可能表现为“内存好像还能撑”,调度器也可能继续塞 Pod;等 swap 把磁盘拖垮或者回收抖动起来,问题就不是某个 Pod 崩了,而是整个节点都开始不稳定。换句话说:**K8s 更希望你在内存不够时明确地失败(OOM/驱逐),而不是靠 swap 模糊地苟住然后拖死全场。**这听起来残酷,但对集群来说反而更安全、更可控。

所以关闭 swap 并不是“浪费资源”,而是让 K8s 的资源治理逻辑更真实:内存不够就按规则处理,而不是让磁盘偷偷充当内存,最后把系统带进不可预测的抖动和性能雪崩。

更多推荐