搜索
您的当前位置:首页正文

基于perf和火焰图进行程序性能优化

来源:步旅网

这里记录一次我使用perf和火焰图优化程序性能的过程。
1、启动程序,查找到想要分析的进程的pid

ps aux | grep /backend_node

2、使用perf对程序进行运行监测

sudo perf record -a -g -p 16729
-a:表示记录所有 CPU 上的事件。这意味着 perf 会收集所有 CPU 上的性能数据,而不仅仅是某一个 CPU 上的。
-g:表示启用调用图(call graph)的记录。调用图会显示函数之间的调用关系,帮助你理解性能瓶颈发生在哪个函数及其调用链中。
-p 16729:表示只记录进程 ID 为 16729 的性能数据。
这个命令会记录所有 CPU 上,进程 ID 为 16729 的所有硬件事件(默认情况下包括 CPU 周期、指令数等),并生成调用图。

或者

sudo perf record -e cpu-record -g -p 14978
-e cpu-clock:表示记录特定的事件,这里是 CPU 时钟周期事件。cpu-clock 是一种计数 CPU 时钟周期的事件,与 CPU 频率相关,通常用于测量 CPU 时间。
-g:同上,表示启用调用图的记录。
-p 16729:同上,表示只记录进程 ID 为 16729 的性能数据。
这个命令会记录进程 ID 为 16729 的 CPU 时钟周期事件,并生成调用图。

主要区别:

事件类型:
    第一个命令没有指定具体的事件,因此它会记录默认的硬件事件集合(通常是 CPU 周期、指令数等)。
    第二个命令指定了 cpu-clock 事件,即 CPU 时钟周期事件。
CPU 范围:
    第一个命令使用 -a 选项,记录所有 CPU 上的事件。
    第二个命令没有使用 -a 选项,但由于指定了进程 ID,它只关注特定进程的性能数据,尽管在多核系统上该进程可能会在不同 CPU 上运行。

在实际使用中,选择哪个命令取决于你感兴趣的性能数据。如果你想要全面了解某个进程的性能表现,使用第一个命令可能更合适。如果你特别关注 CPU 时间,并且想要详细分析哪个函数占用了最多的 CPU 时间,那么第二个命令可能更合适。
更多关于perf的学习可以参考下面两篇资料:

3、生成火焰图

sudo perf script -i perf.data > perf.unfold
./FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
./FlameGraph/flamegraph.pl perf.folded > perf_2.svg

4、在浏览器中打开火焰图进行分析
5、找出影响系统性能的函数
如下:

sudo perf top 可以看到整个系统消耗性能的函数

因篇幅问题不能全部显示,请点此查看更多更全内容

Top