perf工具简介+火焰图制作与解读
1、perf工具简单原理
perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析指定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。
使用perf,可以分析程序运行期间发生的硬件事件,比如instructions retired、processor clock cycles等;也可以分析软件事件,比如page fault和进程切换。
1.1 什么是PMU
Performance Monitor Unit,性能监视单元,其实CPU提供的一个单元,属于硬件的范畴。通过访问相关的寄存器能读取到CPU的一些性能数据,目前大部分CPU都会提供相应的PMU。
1.2 硬件特性之cache
内存读写是很快的,但是还是无法和处理器指令执行速度相比。为了从内存中读取指令和数据,处理器需要等待,用处理器时间来衡量,这种等待非常漫长。cache是一种SRAM,读写速度非常快,能和处理器相匹配。因此将常用的数据保存在cache中,处理器便无需等待,从而提高性能。cache的尺寸一般都很小,充分利用cache是软件调优非常重要部分。
1.3 tracepoints
tracepoints是散落在内核源码中的一些hook,它们可以在特定的代码被执行到时触发,这一特性可以被各种trace/debug工具所使用。
perf将tracepoint产生的时间记录下来,生成报告,通过分析这些报告,调优人员便可以了解程序运行期间内核的各种细节,对性能症状做出准确的诊断。
这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。
下图展示perf整体架构
2、perf 使用
perf提供的事件主要可以分为三种:
-
Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
-
Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
-
Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节,比如slab分配器的分配次数等。
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 | 用于定义动态检查点。 |
2.1 perf list
perf list查看当前系统支持的性能事件
sw实际上是内核的计数器,与硬件无关。
hw和cache是CPU架构相关的,依赖于具体硬件。
tracepoint是基于内核的ftrace,主线2.6.3x以上的内核版本才支持。
软件事件:
事件名称 | 含义 |
---|---|
alignment-faults | 非内存对齐的访问错误计数,内核会处理这些问题,但是会降低性能。这种情况只会发生在某些架构上(绝不会发生在x86上)。 |
Context-switches OR cs | 上下文切换计数,2.6.34之前统计在用户空间,之后版本统计在内核空间 |
cpu-clock | CPU clock count |
cpu-migrations OR migrations | 进程/线程 切换cpu的次数 |
emulation-faults | 未实现指令错误的计数(没用过) |
major-faults | 一般在swap中出现,除了需要内存映射,还需要IO时的计数 |
minor-faults OR faults | 物理内存未映射给进程时,产生的错误计数(无IO) |
task-clock | 正在运行任务的clock count |
硬件事件:
事件名称 | 含义 |
---|---|
branch-instructions OR branches | 已执行的分支指令 |
branch-misses | 预测分支指令 |
bus-cycles | 总线的周期 |
cache-misses | 缓存miss,通常也是指最有一级缓存,和缓存访问一起计算缓存miss率 |
cache-references | 缓存访问,通常指最后一级缓存,取决于CPU的设计 |
cpu-cycles OR cycles | CPU总周期,受频率调整影响 |
instructions | 已执行的指令数,会受硬中断次数影响 |
ref-cycles | CPU总周期,不受频率调整影响 |
事件太多,不一一列举,有兴趣增加知识宽度的,可以网络搜索或者 man 解决。
2.2 perf top
perf top类似top命令,主要用于实时分析各个函数在某个性能事件上的热度,能够快速的定位热点函数,包括应用程序函数、
模块函数与内核函数,甚至能够定位到热点指令。默认的性能事件为cpu cycles。
列名 | 含义 |
---|---|
Overhead | 符号引发的性能事件比例 |
Shared Object | 符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。 |
Symbol | 符号名,前面的 [ ] 表示DSO类型,[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库,[k]表述此符号属于内核或模块 |
当然还可以使用
-e:指定事件
-p:指定进程
更多参数,请 perf –help
2.3 perf stat
用于输出指定程序的性能统计数据
各事件含义前文已有解释,这里不再赘述。
常用参数:
-p:指定进程
-a:从所有CPU上收集性能数据
-C:从指定CPU上收集数据
更多参数请参考 perf –help 或者 man
2.4 perf record
perf record收集采样信息,并记录在文件中,可以离线分析。使用下面的 perf report解析收集的采样数据文件。
常用方式 perf record
-e 指定事件
-p 指定进程
-g 生成调用关系(类似gcc中-g)
-o 输出文件名
采样一段时间,可以使用ctrl+c停止命令,这时会生成 perf.data 文件(默认文件名)
更多参数参考 perf record –help
2.5 perf report
perf report 主要用来分析上面perf record生成的perf.data文件。
常用参数:
-i:指定输入文件
更多参数参照 perf report –help
3、火焰图制作与解读
3.1 火焰图解读
火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。(使用浏览器就能查看)
示例:
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
火焰图是SVG图片,可以互动
-
鼠标悬停,火焰图每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。
-
点击放大,点击某一层,火焰图会水平放大,该层占据所有宽度。再点击左上角 reset zoom,图片恢复原样
-
搜索,按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
3.2 火焰图的制作
制作火焰可以采用一款开源工具 FlameGraph。
上述步骤是github上截图,工具的README.md页面。
4、参考资料
http://www.brendangregg.com/perf.html
https://perf.wiki.kernel.org/index.php/Tutorial#Options_controlling_environment_selection
https://github.com/brendangregg/FlameGraph
今天的文章perf工具简介+火焰图制作与解读分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25209.html