目录缓存回收倾向是什么
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 会让元数据缓存几乎不回收,内存紧张时压力会转移到其他回收路径上,极端情况下加剧系统抖动。除非有明确的实验目的,不建议取这么极端的值。
小文件性能问题往往先受文件系统类型与挂载选项影响:日志模式、预读设置、目录索引方式的差异可能远超这个参数的作用。调整前先做同等条件下的基线对比,确认瓶颈确实在元数据缓存命中上。