工欲善其事必先利其器,要想做Linux下的程序性能优化,就得先知道当前性能的瓶颈在哪里。
这里主要介绍一下常用的工具:perf工具和火焰图的使用方法
本文中的命令都是自己在Ubuntu18.04系统上测试可用的,在其他系统可能会需要不同的版本,但是方法都是一致的。
先简单介绍一下perf工具和火焰图:
Linux的perf工具是一个性能分析工具,用于收集系统的性能数据。它可以提供对CPU使用情况、内存操作、磁盘 I/O、软件事件等的详尽分析。perf能够帮助开发者和系统管理员定位程序性能问题,找出性能瓶颈,并进行性能调优。
perf工具可以收集系统性能相关的信息,如:
- CPU 使用率
- 硬件和软件事件
- 缓存命中率
- 调用图
- 跟踪程序执行路径
另外,perf还支持创建火焰图。火焰图是一种直观的性能分析图表,可以直观展示程序的函数调用情况、执行时间以及资源消耗情况。它通过可视化的方式展示代码中函数之间的调用关系和耗时情况,帮助定位性能瓶颈和优化程序性能。
火焰图工具通常与perf结合使用,可以通过perf script命令将perf的记录数据转换成火焰图所需的格式,然后使用相应的火焰图生成工具(如FlameGraph)生成火焰图。这些火焰图能够以直观的方式展示出程序执行过程中不同函数的调用关系和耗时情况,有助于开发者快速定位性能问题。
工具安装
perf的安装
$ sudo apt install linux-tools-common linux-tools-5.4.0-124-generic linux-cloud-tools-5.4.0-124-generic
火焰图工具安装
$ git clone https://github.com/brendangregg/FlameGraph.git
下载后可以看到文件夹 FlameGraph (我放在了~/software/FlameGraph)
可直接以 ./xxx的方式使用
数据采集及火焰图获取
首先启动我们要看的进程
然后进行数据采集
$ sudo perf record -g -F 1000 -p pid_of_myprocess
$ sudo perf script -i perf.data > out.perf
$ ~/software/FlameGraph/stackcollapse-perf.pl out.perf > out.floded
$ ~/software/FlameGraph/flamegraph.pl out.floded > cp.svg
$ ls
cp.svg aaa.test out.floded out.perf perf.data
火焰图查看
可以使用浏览器打开该svg格式图片,可以ctrl+f 搜索函数
格子的宽度越宽,说明函数耗时越长