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、带宽无关,不能当作磁盘性能结论。