结论:页缓存是内核用空闲内存缓存文件数据页的机制——读写文件先经过页缓存,读命中则免磁盘访问,写默认先写缓存(writeback)由内核异步落盘。它把磁盘 I/O 变成内存操作,是"Linux 为什么内存总是快占满"的原因(free 少但 buff/cache 大,可回收)。
展开:影响分读写两侧:读路径——首次读取触发缺页从磁盘加载,后续访问直接命中;这也是"程序第二次跑快得多"的原因。写路径——write 返回只代表数据进了页缓存,真正的落盘由 flusher 线程按 dirty_ratio/dirty_expire 等参数在后台执行,崩溃可能丢数据,数据库等场景必须用 fsync/fdatasync 或 O_DIRECT/O_SYNC 显式控制。管理策略:页缓存参与内存回收(LRU 双链表 active/inactive),内存紧张时干净页直接回收、脏页先回写。易错点:1)free -h 的 buff/cache 不是"被占用的内存",随时可回收;2)大文件顺序读写会污染页缓存挤掉热数据,可用 posix_fadvise(POSIX_FADV_DONTNEED) 提示回收(备份、日志归档场景);3)O_DIRECT 绕过页缓存做裸盘 I/O,数据库用它自建缓冲体系,但对齐和块大小有严格要求。
排查工具:vmtouch 看文件在缓存中的驻留比例,/proc/meminfo 的 Dirty/Writeback 观察回写压力。
追问方向:readahead 预读算法、容器内存限制与页缓存记账(cgroup 的 memory.stat 里 cache 计入限额)。