直接结论:把 vm.swappiness 设为 1 是生产环境最稳妥的选择,既大幅降低 Swap 活动,又保留 OOM 前的最后一道缓冲;设为 0 反而可能更危险,因新内核仍可能 fallback 到 Swap 且完全丧失换出缓冲,易致服务突停;需通过 pgpgout 观察换页行为、用 sudo sysctl --system 永久生效,并协同配置 swap priority 避免多设备冲突。

直接结论:把 vm.swappiness 设为 1 是生产环境最稳妥的选择,既大幅降低 Swap 活动,又保留 OOM 前的最后一道缓冲。
为什么设成 0 反而可能更危险
很多人直觉认为“0 = 禁用 Swap”,但实际不是:vm.swappiness=0 在较新内核(5.8+)中仍可能 fallback 到 Swap,尤其当内存真正耗尽时;更关键的是,它完全关闭了匿名页换出通道,一旦触发 OOM killer,内核只能粗暴 kill 进程,没有缓冲余地。数据库、Redis、Java 应用等对延迟敏感的服务,swappiness=0 容易导致服务突停,而非平滑降级。
-
swappiness=0不等于“禁用 Swap”,只是移除主动换出逻辑 - OOM 发生时,内核仍可能尝试换出——但此时磁盘 I/O 已严重拥堵,效果极差
- 真实场景中,
swappiness=1的换出量几乎为零,却能避免 OOM killer 直接介入
临时调参后怎么验证是否生效
改完不能只看 sysctl vm.swappiness 返回值,得观察真实换页行为。重点盯两个指标:
- 执行
watch -n 1 'grep -E "pgpgout|pgpgin" /proc/vmstat',关注pgpgout(每秒换出页数)是否明显下降甚至归零 - 用
free -h观察SwapUsed是否停止增长;若还在缓慢上升,说明仍有冷进程页被换出,需结合smem -s swap找出具体进程 - 注意:
top中的%si(swap in 占比)持续 > 5% 就是异常信号,不是“偶尔抖动”
永久生效必须绕过 sysctl -p 的坑
现代 systemd 系统(Ubuntu 20.04+/CentOS 8+)里,sysctl -p 很可能漏加载配置,尤其当你有多个 .conf 文件时。正确做法是:
- 新建独立配置文件:
sudo tee /etc/sysctl.d/99-swap.conf,内容仅一行:vm.swappiness = 1 - 执行
sudo sysctl --system(它会按字母序加载所有/etc/sysctl.d/*.conf,并覆盖默认值) - 验证:
sysctl vm.swappiness输出1,且systemctl list-units | grep sysctl显示 active
别忽略 swap 设备本身的优先级冲突
如果你机器上同时启用了多个 Swap(比如一个 SSD 上的 /swapfile + 一个 HDD 上的 /dev/sdb1),vm.swappiness 再低也没用——内核会优先往高 priority 的设备写,哪怕那是个慢盘。查当前优先级:swapon --show=NAME,PRIORITY;设高优:sudo swapon -p 100 /swapfile(注意:必须先 swapoff 再重启用);固化到启动:/swapfile none swap sw,pri=100 0 0 加入 /etc/fstab。
真正难调的从来不是参数本身,而是你没意识到:同一台机器上,swappiness 和 priority 是两套独立机制,一个管“要不要换”,一个管“往哪换”。漏掉后者,前者的努力就白费了一半。


















