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工具简介+火焰图制作与解读相关推荐

  1. 【性能】perf工具简介

    perf 架构图总览 Events 事件主要有哪些 hardware events:CPU performance monitoring counters software events: 基于ker ...

  2. ProcessOn - 高大上的免费中文在线作图工具/思维导图制作软件

    点此进入:https://www.processon.com/i/5518b08ae4b0a52a9843e123 ProcessOn 网页版在线作图工具!你只需要有一个浏览器即可制作思维导图.流程图 ...

  3. 关键词分词工具_快图制作工具 | 如何制作词云图?

    点击蓝字关注我们 如何制作词云图?    首先,我们需要对"词云"有个简单的概念. "词云"这个概念最先由美国西北大学新闻学副教授.新媒体专业主任里奇·戈登(R ...

  4. perf工具与perf report children的含义

    perf 工具简介 perf全名是Performance Event,是在Linux 2.6.31以后内置的系统效能分析工具,Perf的核心功能主要为三块,一是使用perf stat对事件进行统计,二 ...

  5. GIF动态图制作工具(免费),附教程

    GIF动态图制作工具(免费) 这里推荐一款动态图制作工具(还可以视频剪辑等等功能非常强大且占内存较小),完全免费非常好用! 软件:格式工厂-网上直接搜就行(下载链接在下方) 动态图制作教程如下动态图: ...

  6. android系统GUI设计师必会资源图制作工具

    [原文:http://09bee.lofter.com/post/75947_b40cf/] android系统GUI设计师必会资源图制作工具draw9pacth完全教程,仅供初学者参考. 2011- ...

  7. 动图制作工具---LICEcap

    给大家介绍一个动图制作的工具,因为有时候写博文需要动图来说明我实现的功能,所以要学会如何简单便捷的制作一个动图 LICEcap下载地址 LICEcap 是一款屏幕录制工具,支持导出 GIF 动画图片格 ...

  8. 玫瑰图制作|多种可视化工具集锦

    制作玫瑰图很简单,不仅可以使用在线网站制作,还可以直接写代码生成,"满满地炫酷感",这里给大家推荐四种轻松制作玫瑰图的方法:在线图表法.Excel插件法.PowerBl视觉对象法. ...

  9. java火焰_使用linux perf工具生成java程序火焰图

    Java FlameGraph(火焰图)能够非常直观的展示java程序的性能分析结果,方便发现程序热点和进一步调优.本文将展示如何使用linux perf工具生成java程序的火焰图.火焰图大致长这个 ...

  10. shoeBox超实用的雪碧图(Sprite)图制作工具-使用shoeBox

    shoeBox超实用的雪碧图(Sprite)图制作工具-使用shoeBox 从前端优化说起 浏览器载入单张图片的速度基本取决于图片的大小,但是载入多张图片的速度却和另一个要素息息相关-网络请求数,在图 ...

最新文章

  1. css样式脱离标准文档流
  2. mongoose 批量修改字段_记一次脚本批量修改数据库字符集所埋下的一个坑及解决思路...
  3. Excel中R1C1引用样式
  4. 实现 VC 最小化到 托盘
  5. HDU 2042:不容易系列之二
  6. 数据源管理 | 搜索引擎框架,ElasticSearch集群模式
  7. python日记(四)字典的常见用法
  8. 信安教程第二版-第12章网络安全审计技术原理与应用
  9. Openlayer:学习笔记之View
  10. SSM(Spring+springMVC+MyBatis)框架-springMVC实现图片上传
  11. opencv4下使用SVM进行简单颜色分类
  12. C++引用、取地址符
  13. 各行业的龙头股 (整理)
  14. 帮表弟的女友买了个5900的dell 1420
  15. 消防工程师 7.2 泡沫灭火系统-选型 8.1 防排烟系统-概述
  16. Cloud IDEs For Web Developers – Best Of
  17. 机器学习 | MATLAB实现BP神经网络newff参数设定(中)
  18. 实现人生梦想,共同创造人生辉煌!
  19. 诸葛io的技术架构图_大数据平台的技术演化之路 诸葛io平台设计实例
  20. linux远程获取文件,Linux下实现获取远程机器文件

热门文章

  1. excel服务器 微信设置密码,如何用vba给excel工作簿批量设置添加打开密码? - EXCEL VBA - ExcelOffice【微信公众号:水星Excel】...
  2. DBA必备技能:数据库挂起时进行转储分析诊断案例
  3. php弹出式搜索,使用PHP进行Spotlight搜索
  4. 看董事长陈睿11周年演讲,一起了解B站未来的三个使命吧
  5. 取整函数(ceil、floor、round)
  6. 丝般顺滑!全新垃圾回收器 ZGC 初体验 | 龙蜥技术
  7. 计算机原材料费,计算机基础考试原材料
  8. 问题解决:无法解析的外部符号 _imp_XXXXXXXXX
  9. mac 下 Parallels Desktop 克隆虚拟机 product_uuid 相同
  10. 关于equal和==