文章目录
- 前言
- 二、安装Perf
- 三、二级命令
- 3.1 perf list
- 3.2 perf record/report
- 3.3 perf stat
- 3.4 perf top
- 四、使用火焰图进行性能分析
- 4.1 下载火焰图可视化生成器
- 4.2 使用perf采集数据
- 4.3 生成火焰图
- 参考资料
前言
perf是一款Linux性能分析工具,内置在Linux内核的一个Linux性能分析框架中,利用CPU、性能检测单元(Performance Monitoring Unit,PMU)和软件计数(如软件计数器和跟踪点)等进行性能分析。
主要用途:
- 快速定位和解决系统性能问题。它可以收集程序运行时的性能数据,包括CPU、内存、IO等方面的信息,并提供详细的性能分析和报告。
- 生成程序的调用图,记录程序中函数之间的调用关系,并提供详细的调用图分析和报告。
- 检测程序的内存泄漏问题,收集程序运行时的内存数据,并提供详细的内存泄漏分析和报告。
- 提供程序性能优化的建议,分析程序运行时的性能数据,并提供优化的建议和方案。
工作原理:
- 首先,perf会使用特殊的指令将硬件性能计数器设置为所需的事件类型。这可以包括CPU周期、指令执行数、缓存命中数等。
- perf会定期读取计数器的值,以获得一组采样数据。采样的频率可以由用户配置。
- perf将采样数据与相应的事件关联起来,并进行分析。这可以包括计算平均值、最大值、最小值,以及计算事件之间的关联性等。
- perf可以将分析结果以各种不同的格式进行输出,如报告、图形化界面等。用户可以根据需要选择适合自己的输出格式。
perf调用原理图如下:
二、安装Perf
大多数Linux发行版都包含perf工具。可以使用包管理器来安装perf,例如在Ubuntu上可以使用以下命令进行安装:
sudo apt-get update
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-$(uname -r)
perf工具需要操作系统内核支持。确保Linux内核启用了性能事件计数器(PerformanceCounter)子系统。可以通过检查内核配置选项来确认,通常是在内核配置文件(例如/usr/src/linux/.config)中搜索以下选项: CONFIG_PERF_EVENTS=y
如果该选项没有被启用,需要重新编译内核并启用该选项。
三、二级命令
在终端中输入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 用于定义动态检查点。
3.1 perf list
列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
Hardware event
:由PMU产生的事件,如L1缓存命中。Software event
:由内核产生的事件,如进程切换,发生缺页中断等。Tracepoints event
:由内核静态跟踪点所触发的事件。
tracepoints 不仅是用在 perf 中,它已经是 Linux 内核 tracing 的标准接口了,ftrace,ebpf 等工具都会用到它。这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。
总结:event 是 perf 工作的基础,主要有两种:有使用硬件的 PMU 里的 event,也有在内核代码中注册的 event
3.2 perf record/report
perf record采集数据,并且把数据写入数据文件中,随后可通过perf report命令对数据进行分析
perf record常用选项列表:
选项 | 描述 |
---|---|
-e | 选择一个事件,可以是硬件事件也可以是软件事件 |
-a | 全系统范围的数据采集 |
-p | 指定一个进程的ID来采集特定进程的数据 |
-o | 指定要写入数据的数据文件 |
-g | 使能函数调用图功能 |
-C | 只采集某个CPU的数据 |
perf reprot常用选项列表:
选项 | 描述 |
---|---|
-i | 导入数据文件名称,默认为perf.data |
-g | 生成函数调用关系图 |
–sort | 分类统计信息,如PID、COMM、CPU等 |
3.3 perf stat
perf stat 命令一个通过概括、精简的方式提供被调试程序运行的整体情况和汇总数据的工具。如处理器占用时常,上下文切换次数,缺页异常次数等。选项如下:
选项 | 描述 |
---|---|
-a | 显示所有CPU上的统计信息 |
-c | 显示指定CPU上的统计信息 |
-e | 指定要显示的事件 |
-p | 指定要显示的进程ID |
# perf stat ls
Desktop Documents Downloads Music Pictures Public Templates Videos
Performance counter stats for 'ls':
1.28 msec task-clock:u # 0.165 CPUs utilized
0 context-switches:u # 0.000 M/sec
0 cpu-migrations:u # 0.000 K/sec
104 page-faults:u # 0.081 M/sec
1,054,302 cycles:u # 0.823 GHz
1,136,989 instructions:u # 1.08 insn per cycle
228,531 branches:u # 178.447 M/sec
11,331 branch-misses:u # 4.96% of all branches
0.007754312 seconds time elapsed
0.000000000 seconds user
0.007717000 seconds sys
3.4 perf top
当你有一个明确的优化目标或对象时,可以使用perf stat命令。但有时候系统性能会无端下降,此时需要一个类似于top的命令,以列出所有值得怀疑的进程,从中快速定位问题和缩小范围。
Samples: 1K of event 'cpu-clock', Event count (approx.): 294500000
Overhead Shared Object Symbol
32.77% [kernel] [k] clear_page_orig
11.38% [kernel] [k] __softirqentry_text_start
3.82% libelf-0.170.so [.] gelf_getsym
3.48% [kernel] [k] kallsyms_expand_symbol.constprop.1
2.80% [kernel] [k] filemap_map_pages
2.46% [kernel] [k] module_get_kallsym
2.38% perf [.] d_demangle_callback
Samples
: 采样数,perf总共采集了1k个CPU时钟事件;event
: 事件类型;Event count (approx.)
:事件总数量;
行列:
Overhead
:标识该符号的性能事件在所有采样中的比例,用百分比表示;Shared
:Shared,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等;Object
: Object,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。Symbol
: Symbol是符号名,也是函数名。当函数名未知时,用十六进制的地址来表示。
四、使用火焰图进行性能分析
火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来。表现形式如下所示:
4.1 下载火焰图可视化生成器
git clone https://github.com/brendangregg/FlameGraph.git
4.2 使用perf采集数据
sudo perf record -F 99 -p 2512 -g -- sleep 30
record
:表示采集系统事件,没有采用 -e 执行采集事件,则默认采集 cycles(即 CPU clock 周期)。-F 99
:指定采样频率为 99Hz(每秒99次),如果 99次都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。-p 2512
:指定进程号,对某一个进程分析。-g
:表示记录调用栈。-- sleep 30
:表示持续 30 秒
除了附加到正在执行的进程之外,还可以启动一个进程
sudo perf record -g -F 99 ls
ls
:为需要执行的程序
4.3 生成火焰图
# 统计每个调用栈出现的百分比,然后从高到低排列。
sudo perf report -n --stdio
# 生成折叠后的调用栈
sudo perf script -i perf.data > perf.unfold
# 生成火焰图
./stackcollapse-perf.pl perf.unfold > perf.folded
# 最后生成 svg 图
./flamegraph.pl perf.folded > perf.svg
生成的perf.svg 文件可以直接使用浏览器打开。
此外还有红蓝分叉火焰图,可以分析性能回退问题,感兴趣的读者可以进一步了解。
参考资料
- 系统级性能分析工具perf的介绍与使用
- 从小白到精通:揭秘perf工具的全部功能与操作技巧
- perf性能分析–stat命令
- 使用火焰图(FlameGraph)分析程序性能
- 如何使用perf top探究性能