【性能分析利器之perf浅析】perf stat可以对程序运行过程中的性能计数器(包括Hardware,software counters)进行统计,分析程序的整体消耗情况:
$perf stat lsPerformance counter stats for 'ls': 2.164836 task-clock (msec) # 0.808 CPUs utilized51 context-switches # 0.024 M/sec4 cpu-migrations # 0.002 M/sec333 page-faults # 0.154 M/sec5506056 # 2.543 GHz0 stalled-cycles-frontend # 0.00% frontend cycles idle0 stalled-cycles-backend # 0.00% backend cycles idle6100570 instructions # 1.11 insns per cycle1298744 branches # 599.927 M/sec18509 branch-misses # 1.43% of all branches0.002679758 seconds time elapsed具体各个字段的含义在perf list中已经列出了,这里分析一下重要的数据:
- task-clock (msec): cpu处理task所消耗的时间,单位ms,0.808 CPUs utilized的表示cpu使用率为80.8% = 2.164836 / 2.679758. 该值越高代表程序是CPU bound而非IO bound 类型 。
- instructions:执行的指令条数,insns per cycle: 即IPC,每个cpu周期执行的指令条数,1.11 = 6100570(instructions) / 5506056(cycles),IPC比上面的CPU使用率更能说明CPU的使用情况,关于IPC有一篇brendangregg的文章,很好的说明CPU使用率不是一个很好的性能分析指标
- stalled-cycles-frontend和stalled-cycles-backend表示CPU停滞统计,具体可参考
5.3. perf top
perf top类似系统的命令top,可以实时的查看当前系统各个进程的各个函数的性能计数分析:$sudo perf top

文章插图
perf top的和perf record的功能参数差不多,我们可以加上-e:来统计特定的event,-g: 开启call-graph, -p:分析特定的进程
平常我们用的更多的是perf record,因为它可以将profiler的结果输出到文件,然后通过perf report来进行分析,或者通过可视化工具进行分析和输出 。所以下面着重介绍perf record
5.4. perf record
perf reord可以运行一个命令,但更多的是对已运行的进程进行性能分析,并将分析结果输出到perf.data(默认该文件名)中 。不会像perf top一样实时输出分析结果 。输出perf.data可以通过perf report进行分析,或者通过perf script输出结果给第三方输出可视化的视图 。用前面的示例代码进行测试如下:
$perf record -g -F 99 ./a.out$perf report

文章插图
perf record几个总要参数说明一下:
- -F: 事件采样的频率, 单位HZ, 更高的频率会获得更细的统计,但会带来更多的开销
- -g: 进行堆栈追踪,生成调用关系图,等价于–call-graph, 默认情况下,-g等同于–call-graph fp,即通过frame pointer来进行堆栈追踪 。如果frame pointer被优化掉的话,可以通过dwarf, lbr进行堆栈追踪
- sleep: 采样的时间
perf 提供了内置的可视化分析工具 perf timechart,例如:
$perf timechart record ./a.out$perf timechart

文章插图
perf timechart输出的是进程运行过程中系统调度的情况,无法对程序的具体代码段进行性能分析,但可以看出总结运行情况:running,idle,I/O等,
Brendangregg写了两款对perf采样结果进行可视化分析的开源工具:Flame Graphs和HeatMap. FlameGraphs即所谓的火焰图,是大家使用比较多的工具,能清晰的展示程序各个函数的性能消耗 。HeatMap可以从采样数据中的延迟数据来进行消耗展示 。
下面是对之前实例代码的采样数据perf.data进行FlameGraphs的绘制:
$perf script |./stackcollapse-perf.pl|./flamegraph.pl > fg_output.svg

文章插图
perf_flamegraph.png
6. 参考Perf官方wiki
https://perf.wiki.kernel.org/index.php/Main_Page
Perf 维基百科
https://en.wikipedia.org/wiki/Perf_(Linux)
Perf – Linux下的系统性能调优工具,第 1 部分
https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
Linux 效能分析工具: Perf
http://wiki.csie.ncku.edu.tw/embedded/perf-tutorial
Linux内核调试技术——kprobe使用与实现
https://blog.csdn.net/luckyApple1028/article/details/52972315
推荐阅读
- wireshark网络小故障分析定位
- 笔记本|入门性能可战GTX 1650!用户买不到 Intel Arc显卡本着急了:官方回应
- 详解mysql数据库double write原理、性能影响及相关参数
- centos安装awstats分析apache的日志
- CPU处理器|闲鱼惊现剪角CPU 称502+沙子就能补上 网友:只剩3/4性能了
- 东瀛煮茶利器,日本老铁壶
- 茶叶品牌走高端奢侈品路线分析
- web服务器遭受黑客攻击时的日志分析及排查
- MySQL 多源复制场景分析
- 茶馆的经营模式分析,满足顾客的个性化需求
