服务器swap策略调优,vm.swappiness生产服务器
生产服务器上 swap 怎么配、vm.swappiness 设多少,是很多 Linux 运维新手都会纠结的问题。
本文先给出结论:常规生产服务器建议设置为 10;
内存足够且业务稳定时,可以设为 0 或 1,但要留意 OOM 风险。 下面会讲清原理、查看方法、永久修改步骤和常见避坑点。
swap 和 vm.swappiness 是什么
swap 是磁盘上的交换空间,当物理内存不足时,系统会把不常用的内存页换到 swap 上。
vm.swappiness 控制内核倾向使用 swap 的程度,取值范围 0 到 100。
值越大,系统越积极使用 swap;
值越小,越优先保留物理内存。
先查看当前服务器的 swappiness 值
登录服务器,执行:
sysctl vm.swappiness
或直接查看:
cat /proc/sys/vm/swappiness
这两条命令的输出就是当前生效值,不需要修改任何配置就能看到。
生产服务器建议值怎么选
没有绝对统一的值,需要按内存和业务情况判断:
- 物理内存充足(8G 以上),业务无明显内存尖峰:建议设为 10,保留一定 swap 兜底。
- 物理内存较小(2G 以下),且用 Java、MySQL 等内存大户:建议设为 1 或 10,不要直接设 0,否则内存瞬间不够时容易触发 OOM。
- 对延迟敏感、内存完全够用、且确认没有突发内存需求:可以设为 0 或 1,减少 swap 读写带来的磁盘 IO 干扰。
这里给一个可复用的建议:第一次调优先设为 10,观察一周,如果 swap 使用量依然很高,再往 1 或 0 调整;
如果频繁 OOM,则要把值调大或升级内存。
永久修改 vm.swappiness 的步骤
临时修改重启后失效,生产环境要写入配置文件。
编辑 /etc/sysctl.conf:
vim /etc/sysctl.conf
在文件末尾加入:
vm.swappiness=10
保存后让配置立即生效:
sysctl -p
再次确认生效:
sysctl vm.swappiness
输出为 vm.swappiness = 10 即修改成功。
也可以使用 echo 10 > /proc/sys/vm/swappiness 临时生效,但只推荐测试环境使用。
调优后的验证和避坑
修改后重点看两个指标:
free -h
观察 Swap 行的 used 和 si/so(swap in/out)。
长期出现大量 swap 读写,说明物理内存仍紧张,需要结合业务排查。
常见误区有三个。
第一,把 swappiness 设成 0 并不等于禁用 swap,大量内存压力下系统仍可能使用 swap。
第二,不能只调 swappiness 不处理内存泄漏,先通过 top、ps aux --sort=-%mem 找出占用最高的进程。
第三,云服务器如果使用的是本地盘或机械盘,swap 读写会拖慢整体性能,建议在内存充足时压低 swappiness。
如果你不确定当前业务适合什么值,先从 10 开始,结合监控观察一周再微调。
相比直接照搬网上“设为 0”的说法,分步验证更安全。