在 Linux 系统中,最直观且常用的查看内存缺页中断的方法,就是直接使用 ps 命令检查某个进程累计产生了多少缺页:ps -o pid,comm,minflt,majflt -C nginx 或 ps -o pid,comm,minflt,majflt -p 1234。其中,minflt 表示 minor fault,也就是轻微缺页中断,通常只需要补齐页表映射;而 majflt 表示 major fault,即严重缺页中断,意味着必须通过磁盘 I/O 将页面重新加载到内存中。

怎么看进程级缺页中断次数(minflt/majflt)
查看 Linux 进程级缺页中断次数,最直接有效的方式就是使用 ps 命令查询单个进程的累计缺页数:ps -o pid,comm,minflt,majflt -C nginx 或 ps -o pid,comm,minflt,majflt -p 1234。其中:minflt 是 minor fault,表示页面实际上已经在内存里,例如刚分配的零页、共享库页面等,只需建立映射关系;majflt 是 major fault,表示页面必须从磁盘读取,比如 mmap 文件首次访问、换入页等,通常会带来明显的 I/O 开销。
需要注意的是:minflt 数值高并不一定代表性能异常——像 malloc 小块内存后的首次写入、栈空间扩展、shared library 加载等场景,都会触发 minor fault;但如果 majflt 持续增长,尤其同时伴随较高的 si/so,通常说明系统正在频繁换入换出,需要进一步排查磁盘性能或内存压力问题。
怎么观察系统级缺页中断频率(实时监控)
如果想实时观察 Linux 系统级缺页中断频率,可以使用 vmstat 1 查看每秒统计信息:pgpgin 和 pgpgout 表示每秒换入和换出的千字节数;pgmajfault 表示每秒 major fault 次数(内核 4.15+ 才提供,旧版本可能没有这一列);更通用的指标是 si(swap in)和 so(swap out)——如果它们持续非零,基本可以判断缺页中断已经引发了磁盘活动。
如果出现 si 较高但 pgmajfault 偏低,可能属于非缺页型 swap 活动,例如 kswapd 的主动回收;反过来,如果 pgmajfault 较高而 si 很低,则说明缺页页面更多来自文件映射,比如 mmap 大日志文件,并没有真正走 swap 路径。
perf record -e page-faults -g -p $(pidof app) sleep 10可以抓取指定进程的缺页调用栈,帮助定位到底是哪段代码触发了 page faultcat /proc/可以查看该进程当前物理内存占用情况以及缺页计数快照/status | grep -E "VmRSS|MMU|Min|Major"
怎么确认是否真因缺页导致性能卡顿
缺页中断本身并不一定意味着性能慢——minor fault 几乎没有明显开销;真正容易拖慢系统的是 major fault 之后的磁盘等待。因此不能只盯着缺页次数,还要结合 I/O 延迟一起判断。
可以运行 iostat -x 1,重点关注 await(I/O 平均等待时间,单位毫秒)和 %util(设备忙碌占比)。如果 await > 10ms 且 %util > 80%,同时 si 或 pgmajfault 也在上升,基本可以认定缺页中断已经开始成为系统瓶颈。
另一个明显信号是 /proc/vmstat 中的 pgpgin 和 pgpgout 数值突然升高,再配合 dmesg | tail -20 检查是否出现 “Out of memory: Kill process” 或 “page allocation failure” 等信息——这通常代表缺页问题已经触发了内存回收,甚至可能引发 OOM killer。
为什么 /proc/meminfo 里的 “PageTables” 和 “PageCount” 不反映缺页中断
/proc/meminfo 中的 PageTables,表示的是页表本身占用的内存大小,单位为 KB。至于 PageCount,实际上 Linux 并没有这个字段,这也是很多人在排查内存缺页中断时容易产生的理解误区。也就是说,/proc/meminfo 本身并不提供缺页次数统计。真正用于记录全局累计缺页相关数据的,是 /proc/vmstat 中这些字段:pgpgin、pgpgout、pgmajfault、pgminfault。
执行 grep -E "pgpgin|pgpgout|pgmajfault|pgminfault" /proc/vmstat,即可获取自系统启动以来的累计统计值。需要注意,这些数值都是累加计数,通常要进行两次采样后相减,才能得到某个时间区间内的实际增量。
还有一个容易被忽略的点:在容器环境中,比如 Docker,/proc/vmstat 看到的是宿主机级别的全局视图,无法精准隔离到某一个容器;这时想准确分析单个容器的缺页中断情况,通常需要借助 perf,或者使用 cgroup v2 的 memory.events(其中包含 pgmajfault 计数)来判断。
