c++如何监控文件系统的读写延迟并输出性能分析报告【详解】

风晨君_7162

风晨君_7162

2026-03-24

168人浏览

原创

最直接方法是用 perf 成对捕获 syscalls:sysenter 和 syscalls:sysexit 事件计算时间差;bpftrace 更轻量,支持内核态实时统计延迟分布。

c++如何监控文件系统的读写延迟并输出性能分析报告【详解】

Linux 下用 perf 抓取文件 I/O 延迟事件最直接

Linux 内核的 perf 工具能直接跟踪 sys_enter_read、sys_enter_write 及其返回,配合时间戳差值就能算出单次系统调用延迟。不需要自己写内核模块或 hook libc。

常见错误是只用 perf record -e syscalls:sys_enter_read,这只能抓入口,没出口就无法算延迟。必须成对捕获入口和出口事件:

  • perf record -e 'syscalls:sys_enter_read,syscalls:sys_exit_read,syscalls:sys_enter_write,syscalls:sys_exit_write' -a -g -- sleep 10
  • 导出为脚本:perf script > trace.txt,再用 Python 或 awk 解析每对 sys_enter_* 和紧随其后的 sys_exit_*,按 PID + syscall number 匹配,计算 exit_time - enter_time
  • 注意:不同内核版本中事件名可能带 syscalls:sys_enter_read 或 syscalls:sys_enter_readv 等变体,用 perf list | grep sys_enter 确认可用名

用 bpftrace 实时统计读写延迟分布(推荐)

bpftrace 比 perf script 解析更轻量,适合长期运行监控。它能直接在内核态完成时间差计算和直方图聚合,避免用户态大量日志 IO 拖慢分析本身。

典型场景是想看延迟是否集中在某个区间(比如 99%

  • 运行:bpftrace -e 'kprobe:sys_read { @start[tid] = nsecs; } kretprobe:sys_read /@start[tid]/ { @read_us = hist((nsecs - @start[tid]) / 1000); delete(@start[tid]); }'
  • 输出是微秒级延迟直方图,自动分桶;换成 sys_write 同理
  • 坑点:kretprobe 可能因内核优化被跳过(如函数内联),遇到空直方图先加 -d 看是否 probe 失败;可改用 tracepoint:syscalls:sys_exit_read 更稳定
  • 不支持 Windows 或 macOS,仅限 Linux 4.15+ 且开启 CONFIG_BPF_SYSCALL=y

C++ 程序里埋点测延迟要绕开 stdio 缓冲干扰

如果只监控自己写的 C++ 程序,用 std::chrono 测 read()/write() 调用耗时最准,但必须确保没被 std::ifstream 或 printf 的缓冲层掩盖真实系统调用行为。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

常见错误是测 ofstream ,这根本没触发 write 系统调用,只是拷贝进 FILE* 缓冲区:

  • 测真实磁盘 I/O 延迟,必须用 ::read(fd, buf, size) 和 ::write(fd, buf, size)(即 unistd.h 的裸系统调用)
  • 打开文件时加 O_DIRECT(需对齐 buffer 和 offset)可绕过 page cache,反映底层存储真实延迟;但多数场景应保留 cache,否则测的是“冷读”而非业务常态
  • 注意 clock_gettime(CLOCK_MONOTONIC, &ts) 比 std::chrono::steady_clock 更低开销,尤其高频采样时

生成性能报告时别忽略上下文关联

单纯输出“平均读延迟 2.3ms”意义有限。真正影响判断的是延迟和什么相关:是特定文件?某个进程?还是某类 I/O size?

容易被忽略的点是缺乏横向维度,导致无法定位根因:

  • 在 bpftrace 直方图里加 pid 或 comm 分组:@read_us[pid, comm] = hist(...)
  • 记录每次 I/O 的 size 参数(从寄存器取),画 “size vs latency” 散点图,常能发现大块写突然变慢(如 ext4 journal 刷盘)
  • 延迟 spike 期间检查 /proc/diskstats 的 await 和 %util,确认是本机磁盘瓶颈,还是 NFS 远端卡顿(此时 strace -T 显示 write 返回极慢但 await 正常)

最麻烦的其实是延迟抖动来源混杂:page cache 回收、ext4 barrier、NVMe 队列深度突降、甚至 CPU frequency scaling 都可能让同一操作耗时差 10 倍。抓数据时得同步录下这些指标,不能只盯着 read/write 本身。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

728

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1009

10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2023.11.13

2791

4

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.29

865

3

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3159

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2718

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1468

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2499

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3270

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习