linux监控进程页错误需采样/proc/[pid]/stat的第10、12列计算差分速率:minflt/s为次要缺页(内存映射开销小),majflt/s为主要缺页(磁盘i/o开销大,持续>5次/秒预示内存瓶颈)。

Linux中监控进程页面错误次数,核心是读取内核暴露的累计计数器,并通过时间差分算出每秒速率。直接看单次值没有意义,必须做两次以上采样。
用 pidstat 实时查看每秒页错误频率
最简单直接的方式是使用系统自带的 pidstat 工具:
- 运行
pidstat -r 1,每秒刷新一次,输出中 minflt/s 和 majflt/s 列就是当前进程的次要和主要缺页中断速率(单位:次/秒) - 监控指定进程:如 PID 是 1234,执行
pidstat -r -p 1234 1 - 该命令底层正是解析
/proc/[pid]/stat的第10、12列,并自动完成时间差分与单位换算
手动读取 /proc/[pid]/stat 获取原始数据
若需在 C++ 或脚本中集成,应访问 /proc/[pid]/stat 文件:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 第10个字段(从1开始数)是 minflt:自启动以来的次要缺页次数
- 第12个字段是 majflt:自启动以来的主要缺页次数
- 注意第2字段是进程名(含括号和空格),不能简单按空格切10次;推荐用
std::istringstream跳过前9个字段后提取 - 字段之间可能有多个空格或制表符,
>>操作符会自动跳过空白,比strtok更可靠
计算每秒速率的关键细节
累计值本身不是速率,必须结合精确时间间隔计算:
- 用
clock_gettime(CLOCK_MONOTONIC, &ts)获取单调递增时间戳,避免受系统时间调整影响 - 两次采样时间差
dt = t1 - t0(单位:秒),用它去除以缺页增量:(minflt1 - minflt0) / dt - 不要用
sleep(1)控制间隔——调度延迟会导致分母失真,造成速率误判 - 首次采样无参考值,应丢弃;建议最小间隔 ≥ 500ms,太短易受抖动干扰
区分 minor 与 major 缺页的实际意义
二者代价差异极大,监控目标不同,处理方式也不同:
- minor fault(软缺页):页已在内存(如写时复制、刚换入),仅需建立页表映射,开销小;每秒几千上万次属正常
- major fault(硬缺页):页不在内存,需从磁盘加载(swap 或文件),伴随 I/O 延迟;若持续 > 5 次/秒,通常表明内存不足或 swap 频繁,是性能瓶颈信号
- 线上监控建议单独告警
majflt/s,比如连续 3 秒超过阈值就触发通知










