首页/系统/Linux 内核与性能调优速查/vmtouch 页面缓存探查与预热
内存与 OOM58 条

vmtouch 页面缓存探查与预热

vmtouch 可查看文件/目录在页缓存中的覆盖率,也可预热(-t)或驱逐(-e)缓存,用于验证缓存命中和控制内存占用。

vmtouch 是什么

vmtouch 是 Linux 上探查与操作页缓存的命令行工具。它通过 mincore() 判断文件的哪些页已常驻内存,给出常驻字节数与命中比例;同一套接口还能把文件读进缓存(-t 预热)、把页从缓存中清出(-e 驱逐)、以及用 mlock() 长期锁定(-l)。它既支持单个文件,也支持对整个目录递归汇总。

基本信息

适用平台Linux(无官方 Windows/macOS 版本)
安装方式EPEL 源中的 vmtouch 包,或源码 make && make install
权限要求查看用普通用户;-t/-e/-l 需 root
常用选项-v 详细 / -t 预热 / -e 驱逐 / -l 锁定 / -h 人类可读单位
底层机制mincore() 查常驻,read() 触发入缓存,posix_fadvise() 驱逐

典型使用场景

  • 验证缓存命中:怀疑大文件读取慢是每次回源磁盘时,先确认它是否已常驻页缓存
  • 服务预热:Java 服务刚重启时首个请求延迟高,可在流量接入前把 JAR 与依赖库读进缓存
  • 缓存核算:确认内存被页缓存占用了多少,评估是否挤占业务内存
  • 冷启动测试:用 -e 驱逐后复测首次访问延迟,量化缓存带来的收益
  • 发布前校验:对关键静态资源预热,避免新版本首次读取出现抖动

常用命令

常用命令
vmtouch -v /data/app.jar          # 查看单文件在页缓存中的常驻比例
vmtouch -v /usr/lib/jvm/          # 目录模式:递归汇总整个目录
sudo vmtouch -t /data/app.jar     # 预热:把文件内容读进页缓存
sudo vmtouch -tl /data/app.jar    # 预热并 mlock 锁定,防止被回收
sudo vmtouch -e /data/app.jar     # 驱逐:把该文件的页从缓存中清出
vmtouch -h /data/                 # 用人类可读单位显示字节数

输出逐列读法

字段含义判读
Files参与统计的文件数量目录模式下通常远大于 1
Resident Pages已常驻内存的页数越接近 Total Pages 命中越高
Elapsed遍历耗时与大目录的总数据量成正比
Efficiency常驻字节占总字节比例接近 100% 表示已全量缓存
Free/Reclaimable系统空闲与可回收内存预热前确认增长空间,避免挤爆内存
预热只对首次读取有效:未加 -l 的页在内存紧张时仍会被内核回收,高峰过后预热收益可能归零;加 -l 锁定则不可回收,需要预留内存额度。
vmtouch 的 Efficiency 只描述页在内存中的比例,与设备 IOPS、带宽无关,不能当作磁盘性能结论。

易错点

  • 对整盘无脑 -t 预热:页缓存吃满内存触发全局回收,反而拖慢在线业务;应按文件清单精确预热
  • -l 锁定页占用不可回收内存,锁定量超过可用内存会触发 OOM,锁定总量必须设上限
  • 生产环境用 -e 驱逐共享库或热点数据,会让后续请求全部落盘,表现为延迟尖刺
  • 把 Efficiency 高当成磁盘快:冷启动后的第二遍测试本来就快,需用驱逐前后对比才有说服力

数据来源与参考

  • vmtouch 官方文档(vmtouch(8))
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌