vm.vfs_cache_pressure 控制内核回收 dentry/inode 缓存的激进程度,默认值100,调低至40–60可减少缓存过早回收,缓解内存压力、降低swap触发频率,但需配合vm.swappiness=10协同生效。

直接改 vm.vfs_cache_pressure 并不能“关闭”swap,但它能显著降低 swap 被触发的频率——原理是让内核更愿意保留文件缓存(page cache),从而腾出更多空间给活跃进程使用,减少因内存紧张而被迫换出匿名页(anon pages)到 swap 的需求。
vm.vfs_cache_pressure 是什么
这个参数控制内核回收 dentry 和 inode 缓存(即目录项和索引节点缓存)的“积极性”。它不直接影响 swap,但间接影响内存压力判断:
- 值越低(如 50),内核越倾向于保留文件缓存,不易回收;
- 值越高(如 200),内核越激进地释放这些缓存,腾出内存给其他用途(比如 anon 内存);
- 默认值是 100,属于平衡策略。
当系统频繁写入日志或读取大量小文件时,dentry/inode 缓存会快速膨胀。若 vfs_cache_pressure 过高,内核会过早回收这部分缓存,导致后续访问变慢、I/O 增加,进而加剧内存压力——最终可能把本可保留的 anon 内存推入 swap。
为什么调低它能减少 swap 活动
调低该值(推荐设为 40–60),本质是“让缓存多留一会儿”,好处有三:
- 减少因缓存反复重建带来的 CPU 和 I/O 开销;
- 避免因缓存被清空后,内存看似“空闲”实则需立即重新加载,造成瞬时压力尖峰;
- 给 page cache 更大缓冲空间,使内核在决定是否 swap anon 页面前,有更多余地通过回收 file-backed 页面来腾内存(而 file-backed 页面可直接丢弃或回写,无需 swap)。
怎么设置才有效
仅调低 vfs_cache_pressure 不够,需配合 swappiness 才能形成协同效果:
- 先确认当前值:
cat /proc/sys/vm/vfs_cache_pressure; - 临时生效(测试用):
sudo sysctl vm.vfs_cache_pressure=50; - 永久生效:在
/etc/sysctl.conf中追加一行vm.vfs_cache_pressure=50,再执行sudo sysctl -p; - 务必同步调整
vm.swappiness(建议设为 10),否则 vfs 缓存留得再多,内核仍可能优先换出 anon 页。
注意边界情况
不是越低越好。设为 10 或更低可能导致:
- 长时间运行后 dentry/inode 缓存持续累积,占用数百 MB 甚至数 GB 内存;
- 在内存极度受限的嵌入式或低配 VPS 上,反而加速 OOM;
- 某些高频元数据操作场景(如大量
stat()或目录遍历)可能受益于适度回收,此时过低值反而拖慢响应。
生产环境推荐值:服务器设为 50,桌面或日志密集型服务可试 40,不建议低于 30。

















