缺页是什么
缺页是进程访问尚未映射到物理内存的页时触发的异常,分两类:次缺页(minor fault)只需在内存内建立映射或复用缓存页,代价很小;主缺页(major fault)必须从磁盘或 swap 读入数据,代价是毫秒量级。因此看缺页不能只盯总数——major fault 的速率才与应用的延迟表现直接相关,而 minor fault 数量大在 JVM 这类大堆应用中属于常态。
基本信息
| 进程级 | ps -o min_flt,maj_flt -p <pid> 或 /proc/<pid>/stat 中对应字段 |
|---|---|
| 系统级 | /proc/vmstat 的 pgfault 与 pgmajfault(累计值) |
| 速率工具 | pidstat -r(直接给出 minflt/s 与 majflt/s) |
| 程序级 | /usr/bin/time -v 输出中的 page faults 统计 |
| 配套指标 | VmRSS、SwapFree、pswpin/pswpout |
| 判读要点 | 关注速率与趋势,而非累计次数 |
典型使用场景
- 排查应用启动缓慢:启动阶段大量 major fault 说明在从磁盘读入代码与数据
- 判断工作集是否被过度回收:majflt/s 上升常伴随热页被换出后重新读入
- 评估 swap 的实际影响:majflt 与 pswpin 同步增长说明换页代价已体现在延迟上
- 按进程定位重灾区:用 pidstat -r 排序找出缺页最频繁的进程
- 对比内存配置调整前后的缺页速率,量化扩容或缓存调优的收益
查看速率
查看速率
ps -o pid,min_flt,maj_flt,comm -p 12345 # 单进程累计缺页次数
pidstat -r -p 12345 1 5 # 每秒次缺页与主缺页速率,判断当前是否活跃
pidstat -r 1 5 # 全进程视图,按 majflt/s 手工比对找出重灾区
grep pgmajfault /proc/vmstat # 系统级累计主缺页,需两次采样求差
/usr/bin/time -v ./app 2>&1 | grep -i 'page faults' # 程序运行期的缺页统计
cat /proc/12345/status | grep -i vm # 同步看 VmRSS 等内存指标,判断是否在增长指标读法
| 指标 | 含义 | 判读要点 |
|---|---|---|
| minflt/s | 每秒次缺页次数 | 内存内解决,代价小,大堆应用本就很高 |
| majflt/s | 每秒主缺页次数 | 需要磁盘 IO,直接影响延迟 |
| pgmajfault | 系统级累计主缺页次数 | 累计值,必须差分 |
| VmRSS | 进程常驻内存 | 与缺页趋势一起看是否在持续增长 |
JVM 与大型内存应用的 minor fault 数量天然巨大,这是堆内存按需分配的正常表现。判断是否异常应看速率相对自身基线的变化,而不是拿一个固定数字比较。
主缺页速率高不一定是应用的问题:常见原因是内存被过度回收、工作集超出物理内存,或容器限额导致缓存被频繁丢弃。定位时要结合 SwapFree、回收计数与 cgroup 的内存事件一起看。