Linux之perf性能分析

工具安装

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 的繁忙程度,所以一般选择暖色调。

常用性能分析工具

Linux性能观测工具

一些调试技巧:

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

参考