page-cache

查看和回收 Linux 页缓存,区分缓存、可用内存与内存压力

补充说明

page cache 是内核为文件内容保留的内存副本:读文件命中缓存时不必访问磁盘,写操作先进入缓存再回写。它属于可回收内存,所以 free 里的 buff/cache 高并不等于内存不足;真正要看的是 MemAvailable、回收扫描计数和 PSI。

常用示例

# 查看缓存、脏页和真正可用的内存
free -h
grep -E '^(MemAvailable|Cached|Buffers|Dirty|Writeback):' /proc/meminfo

# 查看单个文件有多少内容在 page cache 中
vmtouch -v /var/lib/app/data.bin

# 第一次读与缓存命中的耗时对比(观察 real 时间)
time dd if=/var/lib/app/data.bin of=/dev/null bs=1M count=512

# 让指定文件的干净缓存页被回收(不删除文件)
vmtouch -e /var/lib/app/data.bin

# 查看文件实际占用的缓存页(较新的 util-linux 提供 fincore)
fincore /var/lib/app/data.bin

# 清理干净页缓存和可回收 slab:仅用于测试/基准,不要在生产例行执行
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

O_DIRECT 读写会绕过 page cache,适合数据库等自行管理缓存的场景,但要求缓冲区地址、长度和文件偏移按设备逻辑块对齐。

易错点与排错

读完自测

  1. free 里 buff/cache 很高,是否意味着需要加内存?
  2. 为什么执行 drop_caches 后 Cached 没有明显下降?
  3. tmpfs 占用的内存在 Cached 里,能不能通过 drop_caches 释放?
答案
  1. 不一定。page cache 是可回收内存,压力下会被释放;应看 MemAvailable、直接回收计数和 PSI,而不是单看缓存大小。
  2. 有脏页尚未回写,或缓存页仍被映射/引用;drop_caches 只处理干净、可回收的页。
  3. 不能。tmpfs/shmem 没有磁盘后备,只能删除文件、换出或由应用释放,drop_caches 对它无效。

相关条目