如何控制perf在代码指定阶段采样或过滤目标函数分析性能?
Perf 精准定位性能问题的实用方案
一、代码控制perf采样起始时机
- 支持通过信号触发或系统调用直接控制:
- 信号触发法:启动perf时添加
--signal=SIGUSR1参数,在代码完成JSON解析后,调用kill(getpid(), SIGUSR1)启动采样;若需要提前结束采样,可搭配--stop-signal=SIGUSR2,在目标阶段结束时发送对应信号。 - 系统调用直接控制:在代码中使用
perf_event_open系统调用创建采样事件,在进入树构建及后续处理阶段时手动开启采样,退出时关闭,完全自定义采样区间。
- 信号触发法:启动perf时添加
二、过滤JSON阶段的干扰数据
- 采样时直接过滤:指定仅对目标函数采样,例如
perf record -g --filter 'target_function*',只采集目标函数及其子调用栈的事件;针对分支缺失/缓存缺失事件,可直接过滤排除JSON相关函数:perf record -e branch-misses --filter '!json_parse*'(假设JSON解析函数以json_parse开头)。 - 事后数据过滤:用
perf script导出采样数据后,通过grep -v json_过滤掉JSON相关调用栈;或在perf report中用--exclude-symbol=json_build* --exclude-symbol=json_parse*参数,直接排除无关符号的统计。
三、图形展示时忽略无关部分
- perf report TUI界面:进入界面后按
x键输入要排除的JSON相关符号,或使用--exclude-symbol参数启动,隐藏无关函数的统计条目。 - 火焰图生成时过滤:导出perf脚本后过滤再生成火焰图:
perf script | grep -v json_ | flamegraph.pl > target_stage.svg,仅保留目标阶段的调用栈图形。 - 自定义排序与显示:使用
perf report --sort symbol --show-total-period,聚焦目标符号的占比,手动忽略JSON相关条目。
内容的提问来源于stack exchange,提问作者Andrew Benor
相关产品推荐
相关产品推荐

