软件的性能分析,往往需要查看CPU耗时,了解瓶颈在哪里
1 安装perf 和 flamegraph
Ubuntu上通过源码安装perf:
// 安装必要的依赖项: sudo apt-get install build-essential libelf-dev libunwind-dev // 从官方网站下载perf源代码: wget https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/perf-<version>.tar.gz //解压缩下载的文件: tar -xzvf perf-<version>.tar.gz //进入解压后的目录: cd perf-<version> // 编译并安装perf: make sudo make install // 检查perf是否成功安装: perf --version
flamegraph不需要安装,直接下载源码就可以使用其提供的脚本
https://github.com/brendangregg/FlameGraph
2 如何生成火焰图
// 1 检测进程 sudo perf record -F 99 pid -g -- sleep 30 对进程ID为181的进程进行采集,采集时间为60秒 执行期间不要退出上述代码中perf record表示记录,-F 99表示每秒99次 -p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒 执行完这行指令后,会自动生成perf.data文件 // 2 解析数据 sudo perf script -i perf.data & > perf.unfold // 3 符号进行折叠 ./stackcollapse-perf.pl perf.unfold &> perf.folded // 4 生成svg图 ./flamegraph.pl perf.folded > perf-$(date +%Y%m%d-%H:%M:%S).svg • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15
在 Flamegraph 生成的火焰图中,每个矩形代表一个函数,矩形的宽度表示该函数占用 CPU 时间的比例,矩形的高度表示函数调用的深度。
3 火焰图
火焰图是svg图片,可以与用户互动。
(1)鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子。
(2)点击放大
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
在 Flamegraph 生成的火焰图中,search 和 ic(inverted call tree)是两个非常有用的功能。
search 按钮可以用于在火焰图中搜索特定的函数或代码段。点击 search 按钮后,输入要搜索的函数或代码段的名称,即可在火焰图中定位到该函数或代码段的位置。这个功能非常方便,可以帮助用户快速地定位到感兴趣的函数或代码段。
ic(inverted call tree)按钮可以用于生成倒置的调用树。在默认情况下,Flamegraph 生成的是正常的调用树,即从上到下表示函数调用的层级关系。而倒置的调用树则是从下到上表示函数调用的层级关系。这个功能可以帮助用户更好地理解函数之间的调用关系,从而更好地进行性能分析和优化。