工具安装
1. ubuntu下安装
1 2 3 4 5 6 7 8
| # 安装perf工具,执行如下命令: $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get autoremove $ sudo apt-get install linux-tools-common linux-tools-$(uname -r)
#查看perf工具的版本,执行如下命令: $ perf --version
|
2. 源码编译
功能简介
perf –help之后可以看到perf的二级命令。
序号 |
命令 |
作用 |
1 |
annotate |
解析perf record生成的perf.data文件,显示被注释的代码。 |
2 |
archive |
根据数据文件记录的build-id,将所有被采样到的elf文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。 |
3 |
bench |
perf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。 |
4 |
buildid-cache |
管理perf的buildid缓存,每个elf文件都有一个独一无二的buildid。buildid被perf用来关联性能数据与elf文件。 |
5 |
buildid-list |
列出数据文件中记录的所有buildid。 |
6 |
diff |
对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。 |
7 |
evlist |
列出数据文件perf.data中所有性能事件。 |
8 |
inject |
该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。 |
9 |
kmem |
针对内核内存(slab)子系统进行追踪测量的工具。 |
10 |
kvm |
用来追踪测试运行在KVM虚拟机上的Guest OS。 |
11 |
list |
列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。 |
12 |
lock |
分析内核中的锁信息,包括锁的争用情况,等待延迟等。 |
13 |
mem |
内存存取情况。 |
14 |
record |
收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。 |
15 |
report |
读取perf record创建的数据文件,并给出热点分析结果。 |
16 |
sched |
针对调度器子系统的分析工具。 |
17 |
script |
执行perl或python写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。 |
18 |
stat |
执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等。 |
19 |
test |
perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。 |
20 |
timechart |
针对测试期间系统行为进行可视化的工具。 |
21 |
top |
类似于linux的top命令,对系统性能进行实时分析。 |
22 |
trace |
关于syscall的工具。 |
23 |
probe |
用于定义动态检查点。 |
perf火焰图
项目地址
使用方法
1、第一步
1 2
| # Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data. $ sudo perf record -g -p <pid>
|
2、第二步
1 2
| # 用perf script工具对perf.data进行解析 $ perf script -i perf.data &> perf.unfold
|
3、第三步
1 2
| # 将perf.unfold中的符号进行折叠: $ ./stackcollapse-perf.pl perf.unfold &> perf.folded
|
4、最后生成svg图:
1
| $ ./flamegraph.pl perf.folded > perf.svg
|
5. 使用浏览器打开svg
火焰图解读:
- y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
- x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
- 火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。比如图中的longa()函数正是问题所在点。
- 颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
常用性能分析工具
一些调试技巧:
1 2 3 4 5 6
| # 此模式显示的是调用当前函数的函数(即调用者)。换句话说,它展示了哪些函数在调用特定的函数。 $ perf top -C 1 --call-graph caller # 此模式显示的是被当前函数调用的函数(即被调用者)。它展示了当前函数调用了哪些其他函数。 $ perf top -C 1 --call-graph callee # 查看线程tid失败的系统调用,如sendmsg $ perf trace -t <tid> -e sendmsg --failure
|
参考