vm.swappiness 是调节内核回收内存时倾向换出匿名页还是释放 page cache 的权重参数,非开关;设为 0 仅在 oom 前极小概率 fallback 使用 swap,设为 1 是数据库等内存敏感服务最常用折中值。

值越低,内核越倾向于释放 page cache(文件缓存),保留进程使用的匿名页;值越高,则越早把进程堆、栈等匿名页写入 swap。所以调低 swappiness 并不能“禁止换页”,但能显著推迟和减少 swap 活动,尤其在内存未真正耗尽时。
明确 swappiness 的作用边界
swappiness 不控制是否启用 swap 分区,也不决定“内存用到多少才开始 swap”——它影响的是回收策略倾向:
- 设为 0:内核几乎不主动换出匿名页,只在 OOM 前极端情况下 fallback 使用 swap(5.8+ 内核行为更保守)
- 设为 1:保留极小交换意愿,兼顾稳定性与性能,是数据库/Java 服务常用折中值
- 设为 10:适合桌面或容器宿主机,允许冷页适度预换出,避免突发压力导致卡顿
- 默认 60:意味着剩余约 40% 物理内存时就可能启动 swap,对 SSD 和延迟敏感场景并不友好
按场景选推荐值
没有统一最优值,关键看你的负载类型和硬件配置:
- 数据库(PostgreSQL/MySQL)、Redis、内存密集型 Java 应用:设为 0 或 1。这类服务依赖大块连续物理内存,swap 会直接拉高 P99 延迟
- 桌面或开发机(Chrome + VS Code + Docker Desktop):30~40 更实用。比默认 60 更克制,又比 10 更能缓解多标签内存抖动
- Kubernetes 宿主机:≤10,避免内核全局 swap 策略与 cgroup memory.swap.max 冲突
- ≤2GB RAM 的嵌入式设备:可设 80~100,但必须配足够 swap(≥RAM×1.5),否则易触发 OOM
配合 vfs_cache_pressure 协同优化
单独调低 swappiness 有时效果有限——如果 page cache 回收太激进,反而加速内存紧张。此时可同步调整:
- vm.vfs_cache_pressure=40~60:让内核更愿意保留 dentry/inode 缓存,间接腾出更多内存给进程使用
- 该参数需与 swappiness=10 左右协同生效,否则可能引发 slab_reclaimable 持续增长、MemAvailable 快速下降
安全修改与验证方法
临时生效(重启失效):
sudo sysctl vm.swappiness=1
永久生效(写入配置):
echo 'vm.swappiness = 1' | sudo tee /etc/sysctl.d/99-swappiness.conf && sudo sysctl -p
验证是否生效:
- cat /proc/sys/vm/swappiness → 确认输出为设定值
- watch -n 1 'grep -E "pgpgin|pgpgout" /proc/vmstat' → 关注 pgpgout 是否明显下降
- slabtop -o → 观察 slab_reclaimable 是否稳定,避免缓存回收不足引发新压力











