如何使用 linux perf 工具进行代码理解

Posted

技术标签:

【中文标题】如何使用 linux perf 工具进行代码理解【英文标题】:How to use linux perf tool for code comprehension 【发布时间】:2015-08-07 16:50:17 【问题描述】:

我对“perf”记录调用图的能力着迷,并试图了解如何使用它来理解新的代码库。

我在调试模式下编译了代码,并使用以下命令运行单元测试:

性能记录--call-graph dwarf make test

这会创建一个 230 兆的 perf.data。然后我写出调用图

性能报告 --call-graph --stdio > callgraph.txt

这将创建一个 50 兆的文件。

理想情况下,我只想查看属于该项目的代码,而不是内核代码、系统调用、c++ 标准库,甚至是 boost 和任何其他第三方软件。目前我看到像 __GI___dl_iterate_phdr、_Unwind_Find_FDE 等项目。

我喜欢火焰图项目。但是,这种可视化不利于代码理解。是否还有其他项目、文章、想法可能会有所帮助?

【问题讨论】:

尝试通过应用程序的“dso”过滤您的报告。并且任何外部参照工具对于理解新的代码库(cscope、lxr、osxr.org、code.metager.de/source、GUI IDE)都会更有用 perf report -g 对于大型应用程序不应转储到外部文件;它无需重定向即可使用交互式性能报告 TUI 界面工作。还可以尝试github.com/jrfonseca/gprof2dot 脚本将性能报告调用图输出可视化为图片(图);还有 Brendan D. Gregg 的交互式 svg/js FlameGraphs(他经常将许多兆字节的原始报告转储显示为很多 A4 页面)- 性能说明:brendangregg.com/FlameGraphs/cpuflamegraphs.html#perf 【参考方案1】:

perf report -g 对于大型应用程序不应因为过于冗长而转储到外部文件。收集的perf.data(与-g)将在没有文件重定向的情况下使用交互式性能报告TUI界面工作。您可以禁用调用图报告,以查找在 perf record 没有 -gperf report --no-children 时花费最多时间的函数。

有 gprof2dot 脚本 (https://github.com/jrfonseca/gprof2dot) 可以将 lagre perf 报告调用图可视化为紧凑图片(图)。

svg/js 中还有 Brendan D. Gregg 的互动 FlameGraphs;他经常在演示文稿中指出,perf report -g 输出显示许多兆字节的原始报告转储为许多 A4 页面。 perf有使用说明:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html#perf:

# git clone https://github.com/brendangregg/FlameGraph  # or download it from github
# cd FlameGraph
# perf record -F 99 -g -- ../command
# perf script | ./stackcollapse-perf.pl > out.perf-folded
# ./flamegraph.pl out.perf-folded > perf-kernel.svg

PS:你为什么要分析制作过程?尝试只选择一些测试和配置文件。使用较低的配置文件频率来获得较小的 perf.data 文件。同时禁用带有:u 默认事件“周期”后缀的内核模式示例:perf record -F 99 -g -e cycles:u -- ../command

【讨论】:

speedscope.app 也是查看性能配置文件的一个不错的变体。

以上是关于如何使用 linux perf 工具进行代码理解的主要内容,如果未能解决你的问题,请参考以下文章

Perf -- Linux下的系统性能调优工具

Perf -- Linux下的系统性能调优工具

Perf -- Linux下的系统性能调优工具,第 1 部分

使用linux kernel代码编译perf工具

sh 如何使用linux perf工具分析应用程序

Linux perf 工具运行问题