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
- pgpgin/s — 系统从磁盘换入/读入的数据速率(KiB/s)
定义:sar 报告的系统分页读入速率,单位 KiB/s,不是应用 read 调用读取的字节数。
缓存命中的读取不需要磁盘 I/O,不能根据应用读取量直接推算此值。
- pgpgout/s — 系统向磁盘换出/写出的数据速率(KiB/s)
定义:sar 报告的系统分页写出速率,单位 KiB/s,不等于应用 write 调用的即时写入速率。
你的程序 write 文件 → 内核把 dirty page 刷到磁盘 → pgpgout/s 上升。
- fault/s — 全部 page faults(major + minor)
定义:每秒缺页次数,包含 major 和 minor;minor 的速率可由 fault/s − majflt/s 得到。
缺页不一定需要 I/O,例如首次建立映射、写时复制等都可能产生 minor fault。
- majflt/s — major page faults(严重缺页)
定义:必须从磁盘读数据才能满足的缺页。
内存里没有对应内容 → 必须读硬盘 → 最慢的那种 page fault。
- pgscank/s — kswapd 扫描的页数(后台扫描)
定义:kswapd(后台内存回收线程)扫描的页数量(per-second)。
系统检测到内存压力 → 内核后台回收线程试图找可以回收的内存。
- pgscand/s — direct reclaim 扫描的页数(应用线程主动扫描)
定义:应用进程在内存不足时,被迫参与内存回收所扫描的页数。
直接回收说明分配路径需要回收内存,可能造成延迟;不能仅凭此指标断言即将 OOM,还需结合可用内存、回收效果和内存压力观察。
- pgsteal/s — 每秒成功回收的 page 数
定义:通过扫描找到并回收掉的 page 数量。
系统正在回收 page cache 或匿名页。
参考:sar 手册;Page Cache。