Page Cache

​ Page Cache 就是内核为了加速文件读写而在内存中保留的文件页。普通文件的缓冲 I/O 通常经过 Page Cache;缓存未命中时仍可能发起存储 I/O。O_DIRECT 等路径可绕过 Page Cache,因此不能把所有 read/write 都视为缓存访问。

产生

调用

write(fd, buffer, len);

这个时候你只是拿着一个缓冲区(Userspace Page),把数据交给内核。

内核检查:

  • 文件在该 offset 对应的 page cache 是否存在?
  • 如果不存在,缓冲写路径会按需分配缓存页;部分页写入还可能需要先读入原数据。这不等同于 CPU 访问未映射虚拟地址触发的 page fault。
  • 写入通常先把缓存页标记为 dirty,随后回写;write 返回成功本身不代表已经持久化到存储介质。
meian@ubuntu200406:~/work/MyProject/study$ sar -B 1
Linux 5.4.0-153-generic (ubuntu200406) 	11/13/2025 	_x86_64_	(8 CPU)

07:23:57 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
07:23:58 PM      0.00      0.00      9.00      0.00     15.00      0.00      0.00      0.00      0.00
07:23:59 PM      0.00      0.00      8.00      0.00     16.00      0.00      0.00      0.00      0.00
07:24:00 PM      0.00      0.00     15.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:01 PM      0.00     40.00     33.00      0.00     28.00      0.00      0.00      0.00      0.00
07:24:02 PM      0.00      0.00     22.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:03 PM      0.00    404.00     11.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:04 PM      0.00      0.00     12.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:05 PM      0.00      0.00     16.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:06 PM      0.00     44.00    150.00      0.00    252.00      0.00      0.00      0.00      0.00
07:24:07 PM      0.00      0.00     25.00      0.00     15.00      0.00      0.00      0.00      0.00
  1. pgpgin/s — 系统从磁盘换入/读入的数据速率(KiB/s)

定义:sar 报告的系统分页读入速率,单位 KiB/s,不是应用 read 调用读取的字节数。

缓存命中的读取不需要磁盘 I/O,不能根据应用读取量直接推算此值。

  1. pgpgout/s — 系统向磁盘换出/写出的数据速率(KiB/s)

定义:sar 报告的系统分页写出速率,单位 KiB/s,不等于应用 write 调用的即时写入速率。

你的程序 write 文件 → 内核把 dirty page 刷到磁盘 → pgpgout/s 上升。

  1. fault/s — 全部 page faults(major + minor)

定义:每秒缺页次数,包含 major 和 minor;minor 的速率可由 fault/s − majflt/s 得到。

缺页不一定需要 I/O,例如首次建立映射、写时复制等都可能产生 minor fault。

  1. majflt/s — major page faults(严重缺页)

定义:必须从磁盘读数据才能满足的缺页。

​ 内存里没有对应内容 → 必须读硬盘 → 最慢的那种 page fault。

  1. pgscank/s — kswapd 扫描的页数(后台扫描)

定义:kswapd(后台内存回收线程)扫描的页数量(per-second)。

系统检测到内存压力 → 内核后台回收线程试图找可以回收的内存。

  1. pgscand/s — direct reclaim 扫描的页数(应用线程主动扫描)

定义:应用进程在内存不足时,被迫参与内存回收所扫描的页数。

直接回收说明分配路径需要回收内存,可能造成延迟;不能仅凭此指标断言即将 OOM,还需结合可用内存、回收效果和内存压力观察。

  1. pgsteal/s — 每秒成功回收的 page 数

定义:通过扫描找到并回收掉的 page 数量。

系统正在回收 page cache 或匿名页。

参考:sar 手册;Page Cache。