vm.swappiness核心是控制内核换出匿名页的积极性,值越低越倾向释放page cache而非swap匿名页;数据库等内存敏感服务推荐设为1,docker/k8s宿主机≤10,≤2gb设备可设80~100但需配足swap。

核心是控制内核何时、多频繁地把匿名内存页(比如 Java 堆、进程栈)换出到 swap,关键参数就是 vm.swappiness。它不决定是否启用 swap,而是调节“换出积极性”——值越低,内核越愿意释放 page cache,越不愿意动匿名页。
swappiness 设置逻辑和推荐值
默认 60 是为桌面设计的平衡点,服务器场景通常要压低:
- 数据库(PostgreSQL/MySQL)、Java 应用、Redis 等内存敏感服务:设为 1。既避免 OOM 风险,又几乎不触发 swap;设为 0 在较新内核(5.8+)中仅抑制非必要换出,极端内存耗尽时仍可能 fallback 到 swap 或触发 OOM killer。
- Docker/K8s 宿主机:建议 ≤10,防止内核 swap 与 cgroup 的 memory.swap.max 策略冲突。
- 内存 ≤2GB 的轻量设备:可设为 80~100,但必须配足够 swap 分区(≥RAM×1.5),否则容易直接 OOM。
- 普通 Web 服务器或中间件:10~20 是稳妥起点,观察后再微调。
临时与永久生效方法
临时修改(重启失效):
sudo sysctl vm.swappiness=1
永久生效(推荐写入独立配置文件,避免污染主配置):
echo "vm.swappiness = 1" | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
验证是否生效:cat /proc/sys/vm/swappiness
配套调优:避免副作用
单纯压低 swappiness 可能导致 page cache 回收不足,进而挤占可用内存(MemAvailable 快速下降)。这时需同步调整:
- vm.vfs_cache_pressure:默认 100,若发现 slab_reclaimable 持续上涨、缓存难回收,可适当调低(如设为 50~70),让内核更积极释放目录/inode 缓存。
- vm.min_free_kbytes:确保系统保留足够空闲内存用于紧急分配,默认 4096KB 太小,内存充足时建议设为 65536(64MB)或更高,防止因缺 free page 触发直接回收。
效果验证方式
别只看 free -h 里 swap used 是否为 0 —— 那只是当前状态。真正要看的是换页行为是否减少:
watch -n 1 'grep -E "pgpgin|pgpgout" /proc/vmstat'
重点关注 pgpgout(每秒换出页数),调低后应明显趋近于 0;同时用 slabtop -o 观察 slab_reclaimable 是否稳定、MemAvailable 是否不再持续收缩。











