当前位置: 首页
系统平台
Linux查看具体缺页中断次数的方法

Linux查看具体缺页中断次数的方法

热心网友 时间:2026-08-18
转载

这里需要读取的是 proc [pid] stat 中的第 10 个字段(minflt)和第 12 个字段(majflt)来获取累计缺页中断次数,而不是第 15、16 个字段。原因并不难理解:第 2 个字段是用括号包裹的进程名,解析时非常容易把后续字段的位置判断错,所以更安全的方式是先跳过前 9 个

这里需要读取的是 /proc/[pid]/stat 中的第 10 个字段(minflt)和第 12 个字段(majflt)来获取累计缺页中断次数,而不是第 15、16 个字段。原因并不难理解:第 2 个字段是用括号包裹的进程名,解析时非常容易把后续字段的位置判断错,所以更安全的方式是先跳过前 9 个字段,再提取目标值。更稳妥的实现方式,是优先使用 std::istringstream 进行解析,或者直接调用 getrusage(RUSAGE_SELF, &ru),整体可靠性会更高。

Linux怎么查看具体的缺页中断次数

直接读 /proc/[pid]/stat 获取累计值

在 Linux 系统中,内核会把每个进程的软缺页(minor page fault)和硬缺页(major page fault)次数实时记录在 /proc/[pid]/stat 文件中,这些数据不是依赖日志统计,也不是通过命令临时推算出来的。关键字段分别是第 10 个(min_flt)和第 12 个(maj_flt),一定要注意不是第 15、16 个字段——因为第 2 个字段是带括号的进程名(例如 (bash)),它会影响按空格分割后的字段定位,导致后面的字段解析出现偏移。

实际读取时,前 9 个字段必须先正确跳过,然后再取第 10 项和第 12 项。更推荐的做法,是使用 std::istringstream 配合 >> 运算符做字段提取:它能够自动忽略多余空白,处理起来更稳定。相比之下,strtok 或简单的 split(' ') 看似方便,实际上非常容易出错;一旦遇到像 (ja va -jar app.jar) 这种内部本身带空格的 comm 字段,后续字段位置就会立刻错乱。

  • min_flt:软缺页累计次数,页面其实已经在内存中(例如共享库页、已缓存文件页),只需要建立映射即可
  • maj_flt:硬缺页累计次数,页面不在内存里,必须从磁盘载入(会触发 I/O)
  • 字段值类型是 unsigned long,即使进程运行数月通常也不会溢出,但在做差值计算时仍应采用无符号减法,避免回绕后被误判成负增长

getrusage(RUSAGE_SELF, &ru) 更轻量可靠

相比解析文本文件,更建议直接调用 POSIX 接口 getrusage。它会直接返回结构体字段,不需要做字符串解析,也不依赖 /proc 是否已挂载或当前权限是否允许读取。

需要包含的头文件是 ,传入 struct rusage ru 后检查返回值是否为 0;其中 ru.ru_minfltru.ru_majflt 就是所需的两个缺页计数,数据类型为 long

  • 该接口返回的仍然是“截至调用时刻”的累计值,不能直接代替采样差值——如果想计算每秒缺页速率,仍然需要自己保存上一次读数
  • 如果要统计子进程,应使用 RUSAGE_CHILDREN,但它只对已经 wait() 过的子进程生效
  • 在容器环境或对 /proc 访问限制较严格的场景中,getrusage 往往是唯一稳定可用的方案

为什么不能只看一次读数?

无论是 /proc/[pid]/stat,还是 getrusage,返回的都是进程自启动以来的累计缺页次数,并不是“每秒缺页中断次数”。常见误区是只读取一次然后直接除以 1 秒,以为这样就得到了速率——这种做法没有任何统计意义,结果也是不可信的。

如果要得到真实的每秒缺页频率,至少需要进行两次采样,并使用单调时钟(例如 clock_gettime(CLOCK_MONOTONIC))精确计算时间差 dt,再通过公式 (current - previous) / dt_sec 计算速率。

  • 不要用 sleep(1)std::this_thread::sleep_for(1s) 机械控制采样间隔——调度延迟会导致真实间隔明显大于 1 秒,从而让速率计算严重失真
  • 字段变化可能非常快(比如刚执行 mmap 大文件时),也可能长时间保持为 0;单次读数根本无法区分“当前安静”还是“程序卡住”
  • 如果两次读数完全相同,且 dt 很小(例如因为调度抖动落在同一次时钟滴答内),结果为 0 属于正常现象,并不是程序 bug

别被 /proc/meminfovmstat 带偏

/proc/meminfo 中的 Pgpgin/Pgpgout 表示页输入/输出总量,并不等同于缺页中断次数;而 vmstat 里的 si/so 表示 swap 的换入/换出页数,只覆盖硬缺页里涉及交换区的一部分场景,像文件映射、匿名页分配等大量情况都不会完整体现。

这些指标更适合做系统层面的粗粒度观察,但如果要定位某个具体进程的缺页行为,它们无论在精度还是归属上都不够可靠——vmstat 不会告诉你到底是哪个 PID 触发了缺页,/proc/meminfo 也不会区分 minor fault 和 major fault。

  • 如果想确认某个进程是否存在频繁缺页,必须绑定对应 PID,使用 /proc/[pid]/statgetrusage 这类进程级接口
  • 如果观察到 min_flt 快速增长而 maj_flt 几乎不变,大概率对应的是堆内存分配、JIT 编译或 mmap 匿名页;只有 maj_flt 明显上升,才更值得关注真实的 I/O 压力
  • 字段偏移、括号解析、单调时钟、无符号差值——这四个关键点只要有一个处理错误,最终数据就不能用,不是“误差一点点”,而是整体结论都不可信
来源:https://www.php.cn/faq/2961411.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Linux如何查找7天前修改过的文件

Linux如何查找7天前修改过的文件

-mtime +7 这个参数在 Linux 文件查找场景中经常被误解。它真正匹配的是修改时间超过 7 个完整 24 小时周期的文件,也就是 8 天及以上的文件。换句话说,它会筛选出 2026-06-30 及更早修改的文件,而不是很多人理解的“7天前文件”。由于 find 命令的时间计算采用向下取整方

时间:2026-08-18 17:57
Linux如何查看共享内存大小及使用情况

Linux如何查看共享内存大小及使用情况

很多人会把 free 命令中的 shared 字段误认为是 Linux IPC 共享内存大小,其实这是一个非常常见的理解偏差。这个字段真正反映的,是 tmpfs 挂载点(例如 dev shm)所占用的内存情况,并不包含通过 ipcs -m 查看的 System V 共享内存段。那么,Linux 怎

时间:2026-08-18 17:55
Linux查看磁盘使用分布的常用方法与命令

Linux查看磁盘使用分布的常用方法与命令

ncdu 是一款交互式磁盘空间分析工具,能够逐层下钻定位占用空间较大的目录,支持键盘导航、实时排序以及删除确认。它底层基于 du 实现,但在实际排查磁盘占用时大幅简化了操作流程,非常适合 Linux 磁盘使用分析。想直接查看目录级别的磁盘使用分布,就别只盯着 df 的总容量输出——它只能告诉你“磁盘

时间:2026-08-18 17:54
Linux系统序列号怎么查看及查询方法

Linux系统序列号怎么查看及查询方法

在 Linux 中查看物理服务器序列号,最快捷的方法通常是直接读取 sys class dmi id product_serial。普通用户一般无需 root 权限;如果返回为空,通常说明 BIOS 固件没有填写该字段;如果出现报错,则多半与内核限制或 SELinux 安全策略有关。直接读 sy

时间:2026-08-18 17:54
苹果电脑录屏帧率怎么设置fps与清晰度

苹果电脑录屏帧率怎么设置fps与清晰度

苹果电脑自带的录屏工具帧率默认锁定为 30fps,且系统本身不支持直接修改。如果你想在 Mac 录屏时自定义帧率,需要借助 OBS Studio(可在“输出→录制”中设置)或优加蛙这类第三方录屏软件(可在“视频设置”中拖动滑块调整)。苹果电脑录屏时如果想调节画面流畅度,核心就在于设置帧率(FPS)。

时间:2026-08-18 17:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜