如何实时获取Linux Perf采集数据?多子进程写时复制场景问询
实时捕获Perf do_wp_page探测数据的可行方案
直接读取perf record的实时输出流
perf record支持将采样数据输出到标准输出,通过--output -参数即可实现实时输出。你可以在应用中启动该命令作为子进程,捕获其stdout的二进制数据后解析:
sudo perf record -e probe:do_wp_page -ag --output -
注意perf输出的是二进制格式,需要借助libperf库或者自行解析perf的文件格式来提取事件信息。
用perf script实时输出可读文本
如果不想处理二进制数据,可通过perf script实时解析perf record的输出,直接得到可读的事件文本:
- 先创建探针:
sudo perf probe --add do_wp_page
- 启动实时解析流程:
sudo perf record -e probe:do_wp_page -ag -o - | sudo perf script -i -
该命令会将每个do_wp_page事件实时输出为结构化文本行,你的应用只需读取这些文本,提取进程ID、调用栈等字段即可展示。
优化你找到的--switch-output方案
--switch-output支持按时间或事件数触发文件切换,结合文件系统监控(如inotify)即可实时获取新生成的数据文件:
sudo perf record -e probe:do_wp_page -ag --switch-output=10s -o perf.data.%F
上述命令每10秒生成一个带时间戳的perf数据文件,你的应用可通过inotify监控文件目录,一旦新文件生成,就调用perf script -i <文件名>或perf report -n -i <文件名>提取数据并展示。
基于libperf的代码级集成
如果你的应用是C/C++开发,推荐直接使用官方的libperf库,在代码中直接订阅do_wp_page探针事件,实时获取事件数据:
- 初始化perf上下文,指定监听
probe:do_wp_page事件 - 配置采样参数(如开启调用栈采集)
- 启动事件循环,实时接收事件的进程ID、调用栈、时间戳等信息
- 在应用内直接处理并展示这些数据
这种方式集成度最高,延迟最低,无需依赖外部命令。
关键注意事项
- perf操作需要root权限,要么让应用以root运行,要么配置sudo免密执行相关perf命令
- 实时采集会带来一定系统开销,可通过
-p <父进程ID>过滤仅监控你的应用子进程,或调整采样策略降低负载 - 不同内核版本的perf数据格式可能存在差异,需确保运行环境的一致性
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

