Linux中vm.vfs_cache_pressure参数控制dentry和inode缓存回收力度,默认100,值越大越激进回收;需配合vm.swappiness、vm.dirty_ratio等调优,并用slabinfo监控,避免暴力清缓存或设值过高。

Linux 中文件系统元数据缓存(dentry 和 inode 缓存)由内核统一管理,属于 Slab 分配器中的缓存对象,其回收行为受 vm.vfs_cache_pressure 参数直接控制。这个参数不作用于文件内容(page cache),而是决定内核在内存压力下多快、多大力度地释放目录项(dentry)和索引节点(inode)缓存。
为什么需要调这个参数?
默认值为 100,表示 dentry/inode 缓存与 page cache 具有相同的回收优先级。但在以下场景中容易积压:
- 高频路径访问(如 Web 服务遍历
/var/www/下数千子目录) - 大量小文件操作(日志轮转、容器镜像加载)
- 小内存环境(如 2GB 云主机),slab 缓存可能长期占用上百 MB,挤压可用内存
此时 available 内存持续偏低,但 free + buff/cache 看似充足——问题常出在未被及时回收的元数据缓存上。
如何用 sysctl 调整?
✅ 查看当前值
sysctl vm.vfs_cache_pressure # 或直接读取 cat /proc/sys/vm/vfs_cache_pressure
✅ 临时调整(立即生效,重启失效)
# 提高回收倾向:值越大,越激进释放 dentry/inode sudo sysctl -w vm.vfs_cache_pressure=180 # 保守策略(仅轻微加强):适合稳定性优先的生产环境 sudo sysctl -w vm.vfs_cache_pressure=130
⚠️ 注意:设为
0表示完全禁止回收,可能导致 OOM;设为1–99实际效果接近100,不推荐。
✅ 永久生效
编辑 /etc/sysctl.conf,追加一行:
vm.vfs_cache_pressure = 180
然后运行:
sudo sysctl -p
配合使用的其他关键参数
仅调 vfs_cache_pressure 不够,需协同优化整体内存回收逻辑:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
降低 swap 倾向,腾出空间给元数据回收
vm.swappiness = 10
让内核更愿意丢弃 page cache,而非把匿名页换出,间接缓解 slab 压力。
-
确保脏页及时刷盘,避免阻塞元数据回收链路
vm.dirty_ratio = 30 vm.dirty_background_ratio = 10
防止大量未写回的脏页堆积,拖慢 kswapd 回收节奏。
-
监控 slab 使用情况(验证是否生效)
cat /proc/slabinfo | grep -E "(dentry|inode)" # 或使用 slubtop(需安装 kernel-debuginfo)
不建议的操作
❌ 定期
echo 2 > /proc/sys/vm/drop_caches清 dentry/inode
这是暴力清空,会瞬间破坏路径查找效率,引发后续大量磁盘元数据读取,加重 I/O 延迟。❌ 把
vfs_cache_pressure设到300+
可能导致频繁重建 dentry/inode,增加 CPU 开销(尤其 ext4 的目录哈希计算),得不偿失。❌ 忽略
slabtop观察,只看free -h的 cache 数值buff/cache总量里,真正影响元数据的是SReclaimable(可回收 slab),不是全部。
不复杂但容易忽略

















