vmtouch是最直接检测文件是否在page cache中的工具,通过resident pages字段显示缓存页数及占比,例如“25600/25600 100%”表示全部缓存,“0/25600 0%”表示未缓存,其原理是结合mmap、posix_fadvise和mincore系统调用实现。

Linux里没有“文件存在于内存”这种直接概念——文件本身存于磁盘,但它的内容可能被缓存进内存(page cache)。你要查的其实是:这个文件的内容当前是否被加载到 page cache 中,以及占了多少页。这不是靠 ls 或 test 能回答的,得用专门看缓存状态的工具。
用 vmtouch 查文件是否在 page cache 里
vmtouch 是最直接、最轻量的方案,它能告诉你一个文件有多少页驻留在物理内存中。
- 安装(Ubuntu/Debian):
sudo apt install vmtouch - 检查缓存状态:
vmtouch -v /path/to/file - 输出里关键字段是
ResidentPages,比如25/25 100%表示全部缓存;0/25 0%表示完全没缓存 - 注意:即使文件刚被
cat或grep读过,也不一定全在 cache 里——内核按需加载、按 LRU 回收,vmtouch显示的是当前快照
用 /proc//maps + lsof 看进程是否 mmap 了该文件
如果某个进程通过 mmap() 把文件映射进了自己的虚拟地址空间,那这部分内存就属于该进程的 VmRSS(实际物理内存占用),但不一定计入全局 page cache(取决于 mapping flag)。
- 查哪些进程打开了某文件:
lsof /path/to/file - 对每个 PID,看它是否用了 mmap:
grep -i mmap /proc/<pid>/maps</pid> - 再结合
cat /proc/<pid>/status | grep VmRSS</pid>,能看出这部分映射是否实际占用了物理内存 - ⚠️ 这不是“文件在内存”的通用指标,只反映特定进程行为;普通
read()不会出现在maps里
别误用 du、stat 或 free 来判断
这几个命令根本不管 page cache:
-
du -h /path/to/file只显示磁盘占用,和内存无关 -
stat /path/to/file只返回 inode 元数据(大小、时间戳等),不涉及缓存状态 -
free -h显示整体Cached值,但无法拆解到单个文件——你看到的只是“所有缓存页的总和”,没法反推某文件是否在里面 - 试图用
find / -name "xxx" 2>/dev/null或test -f更是完全跑偏:它们只管文件是否存在,跟内存毫无关系
真正难的不是命令怎么敲,而是理解 Linux 的 page cache 是全局、共享、惰性管理的——你看到的“文件在内存中”,其实是一堆分散的 page frame,归属 kernel 的 buffer cache 或 page cache,没有文件名索引。所以 vmtouch 是少数能给出近似答案的工具,但它依赖内核提供的 mincore() 系统调用,而某些场景(如 huge pages、tmpfs 文件)它会失效或返回不准。动手前先确认你的文件系统类型和内核版本是否支持。











