首页/系统/Linux 内核与性能调优速查/缺页统计(minor / major fault)
内存与 OOM58 条

缺页统计(minor / major fault)

次缺页(minor)在内存中解决页表映射,主缺页(major)需要磁盘 IO;major fault 速率直接影响应用延迟。

缺页是什么

缺页是进程访问尚未映射到物理内存的页时触发的异常,分两类:次缺页(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 的内存事件一起看。

易错点

  • 用累计次数判断现状:缺页计数单调递增,必须换算成每秒速率才有意义
  • 只看次缺页忽略主缺页:两者代价差着数量级,混在一起看会低估磁盘等待
  • major fault 高就归因应用:更常见的原因是内存被回收或工作集超出可用内存
  • 在容器里用全局计数判断自身:pgmajfault 是宿主视图,容器应结合 cgroup 的 memory.stat
  • 忽略字段版本差异:进程级统计在不同内核与工具版本中的字段含义可能有细微差别,取值前先确认来源

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst
  • sysstat 文档 pidstat(1)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌