vm.swappiness是内核控制匿名页换出积极性的权重参数,取值0–100,默认60;设为1最常用,兼顾避免swap与oom保底;需结合负载场景调优,并通过sysctl --system永久生效。

调整 vm.swappiness 就是告诉内核“多早、多愿意”把进程使用的匿名内存(比如程序堆、栈)换出到 swap。它不决定 swap 是否启用,而是调节换出的“积极性”。值越低,越偏向保留物理内存;越高,越倾向提前使用 swap。
理解 swappiness 的实际含义
swappiness 取值范围是 0–100,默认为 60。这个数值不是百分比阈值,而是内核内存回收算法中的一个权重系数:
- 设为 60:内核在内存压力初显时(例如可用内存降到约 40% 以下)就可能开始换出匿名页
- 设为 10:只在内存明显紧张时才考虑换出,更依赖 page cache 回收
- 设为 1:仅保留极小换出意愿,作为 OOM 前的最后一道缓冲
- 设为 0:不主动换出匿名页,但内存真正耗尽时仍可能 fallback 到 swap(尤其 5.8+ 内核),或触发 OOM killer
按场景推荐设置值
没有通用最优值,关键看服务类型和硬件条件:
- 数据库(PostgreSQL/MySQL)、Redis、Java 应用:建议设为 1 —— 避免延迟突增,又保留保底能力
- 桌面或开发机(Chrome + VS Code + Docker Desktop):10~30 较平衡,减少后台进程被换出影响前台响应
- Kubernetes 宿主机:若容器启用了 memory.swap.max,宿主机 swappiness 建议 ≤10,避免策略冲突
- 小内存设备(≤2GB RAM):可设为 80,但必须配足够 swap 空间(≥RAM×1.5),否则易 OOM
临时修改与验证方法
改完立刻生效,适合测试效果:
- 执行:
sudo sysctl vm.swappiness=1 - 或等效写法:
echo 1 | sudo tee /proc/sys/vm/swappiness - 验证是否生效:
cat /proc/sys/vm/swappiness输出应为 1 - 观察真实 swap 活动:
watch -n 1 'grep -E "pgpgout|pgpgin" /proc/vmstat',重点关注pgpgout(每秒换出页数)是否下降
永久生效的正确做法
避免传统 sysctl -p 在现代系统中漏加载的问题:
- 新建配置文件:
sudo tee /etc/sysctl.d/99-swap.conf - 重载全部 sysctl 配置:
sudo sysctl --system - 确认已加载:
sysctl vm.swappiness返回 1,且systemctl list-units | grep sysctl显示 active
常见误解与排查要点
swap 仍在用 ≠ swappiness 设错了:
-
free -h显示 swap used 为 0,不代表没启用 —— 可能只是当前无压力 - 查真实状态要综合看:
cat /proc/meminfo | grep -E "MemAvailable|SwapTotal|SwapFree" - 容器环境(Docker/K8s)默认不继承宿主机 sysctl,需显式传参如
--sysctl vm.swappiness=1 - 若用了 zram(RHEL/CentOS 8+ 默认),swappiness 对其无效,zram 是压缩内存而非磁盘 swap











