如何优化perf数据呈现?过滤内核调用仅展示自研程序函数耗时
嗨,针对你想聚焦自研board pilot程序函数耗时占比、过滤内核调用的需求,不管是用perf原生工具直接输出,还是生成火焰图后筛选,都有成熟的解决方案,完全可以避开那些标记为(k)和(.)的内核调用,下面给你详细拆解:
一、用perf直接过滤,只展示自研程序函数
如果你不想生成火焰图,直接通过perf报告查看函数耗时占比,可以通过以下方式过滤:
- 采集阶段精准定位进程:先找到
board pilot的进程ID(用pidof board_pilot获取),然后只采集该进程的调用栈数据:
这里perf record -g -p $(pidof board_pilot) -- sleep 30-g是记录调用栈,sleep 30是采集30秒的数据,你可以根据需求调整时长。 - 生成报告时过滤内核与非目标进程:采集完成后,用以下命令生成只包含
board pilot用户态函数的报告:
其中perf report --exclude-kernel --comm=board_pilot--exclude-kernel会直接排除所有内核空间的样本(对应你提到的(k)和(.)标记),--comm=board_pilot确保只展示属于目标进程的函数,这样你就能看到自研程序各函数的耗时占比了。
二、火焰图的过滤方案
如果习惯用火焰图做可视化分析,也有两种方式过滤内核调用:
1. 生成火焰图前过滤数据
用FlameGraph工具链时,可以在转换折叠栈的阶段就过滤掉内核相关的行:
# 导出perf脚本数据并过滤内核调用,生成折叠栈文件 perf script | grep -v "(k)" | grep -v "\." | stackcollapse-perf.pl > board_pilot.folded # 生成过滤后的火焰图 flamegraph.pl board_pilot.folded > board_pilot_flame.svg
这里grep -v "(k)"和grep -v "\."会剔除所有带内核标记的栈帧,剩下的就只有自研程序的函数调用栈了。
2. 生成火焰图后交互过滤
如果你已经生成了包含内核调用的火焰图(SVG格式),不用重新生成,打开SVG后可以利用火焰图的交互功能过滤:
- 在火焰图的搜索框中输入
board_pilot(或者你的自研函数的前缀/关键词),匹配的函数栈会被高亮; - 点击搜索结果旁的「Hide unmatched」按钮,就能隐藏所有不匹配的内核调用部分,只保留自研程序的函数栈进行分析。
另外,如果你的自研函数有统一的命名前缀(比如bp_开头),可以把搜索关键词换成前缀,过滤会更精准。
内容的提问来源于stack exchange,提问作者shirl
相关产品推荐
相关产品推荐

