首页/系统/Linux 内核与性能调优速查/vm.vfs_cache_pressure 目录缓存回收倾向
sysctl 内核参数72 条

vm.vfs_cache_pressure 目录缓存回收倾向

控制内核回收 dentry/inode 缓存的倾向(默认 100):大于 100 回收更积极,小于 100 更倾向保留。

目录缓存回收倾向是什么

vm.vfs_cache_pressure 控制内核回收 dentry 与 inode 缓存的积极程度,默认 100。这两类缓存保存的是目录项与文件元数据,能让路径解析和属性查询免于反复读磁盘。值大于 100 表示更积极地回收,值小于 100 表示更愿意保留。大量小文件反复遍历的场景(构建系统、文件服务器、镜像仓库)会从中受益,但设为 0 属于极端做法,会让元数据缓存几乎不回收。

基本信息

参数vm.vfs_cache_pressure(默认 100,无量纲)
作用对象dentry 与 inode 缓存,即元数据缓存
大于 100更积极回收元数据缓存
小于 100更倾向保留,减少重复的元数据读盘
等于 0几乎不回收,属于极端设置,通常不建议
观测入口/proc/meminfo 中的 Slab 与 SReclaimable、SUnreclaim

典型使用场景

  • 小文件密集负载:构建、打包、镜像仓库等遍历大量目录的服务
  • 文件服务器:元数据访问频繁,保留缓存能显著减少磁盘操作
  • 排查内存去向:确认 Slab 占用中可回收部分是否与元数据缓存相关
  • 性能对比实验:在相同负载下比较不同取值对目录遍历耗时的影响
  • 回归验证:调整后确认缓存命中改善且内存水位仍可控

查看与调整

查看与调整
sysctl vm.vfs_cache_pressure                # 读当前值
grep -E 'Slab|SReclaimable|SUnreclaim' /proc/meminfo   # 元数据缓存规模
sysctl -w vm.vfs_cache_pressure=50          # 更倾向保留元数据缓存
slabtop -o 2>/dev/null | head               # 按类型看 slab 占用(需安装工具)
dentry_state 2>/dev/null | head             # 部分发行版提供的排查工具

落盘与回读

落盘与回读
# /etc/sysctl.d/99-vm-cache.conf
vm.vfs_cache_pressure = 50    # 保留更多目录与元数据缓存,适合小文件密集负载
# 回读命令:sysctl vm.vfs_cache_pressure

判断线索

现象含义方向
SReclaimable 占比较高可回收的元数据缓存规模大属正常现象,内存紧张时会自动回收
SUnreclaim 持续增长存在不可回收的内核内存占用需要排查具体 slab 类型,不是调这个值
目录遍历耗时长元数据缓存命中不足可评估保留更多缓存或优化访问方式
内存长期紧张缓存与业务争抢优先提高回收积极性或扩容,而不是一味保留
设置为 0 会让元数据缓存几乎不回收,内存紧张时压力会转移到其他回收路径上,极端情况下加剧系统抖动。除非有明确的实验目的,不建议取这么极端的值。
小文件性能问题往往先受文件系统类型与挂载选项影响:日志模式、预读设置、目录索引方式的差异可能远超这个参数的作用。调整前先做同等条件下的基线对比,确认瓶颈确实在元数据缓存命中上。

易错点

  • 设为 0 追求极致保留:内存压力被推到别的回收路径上,系统抖动风险上升
  • 把它当成小文件性能的万能开关:文件系统与挂载选项的影响通常更大,先做 baseline
  • 只看 Slab 总量不看可回收部分:SUnreclaim 高属于另一类问题,调这个值无效
  • 调整后不观察内存水位:保留更多缓存意味着可用内存下降,需要一并监控
  • 在不同负载的机器间照搬取值:访问模式差异决定收益,取值要按实际场景验证

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • man 5 proc(meminfo)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌