性能分析之profiling及火焰图
profiling 是一项非常重要的,但又对很多程序员陌生的技术,它尤其对性能调优有显著帮助。本文以Brendan对perf的介绍稍加引入【底层涉及了太多细节,目前仅关心如何用它对服务器应用进行user-level性能分析
perf使用简单介绍
有几个主要的子命令
- list: 查看支持的事件
- stat: 对事件进行计数,可限定一定时间,可指定事件名
- record: 可指定sampling 频率、事件名、进程号等。它属于static tracing;会生成perf.data,有开销,频率越大,开销越大文件也越大;4.4内核支持用户编写BPF来嵌入,从而可以过滤数据以减少开销
- probe: 动态tracing
- report: 总结由record生成的perf.data数据,以human readable方式显示
比如查看htop在CPU counter上的统计
perf stat htop

倘若需perf支持执行文件,编译不需添加-g参数,保证文件不是stripped就行,否则report时无法查看到符号,像下面这样,

关于命令更多细节可参考Brendan对perf的介绍
国外有个妹子对命令做了个小抄:

关于栈桢
- 编译要支持frame pointer,-fno-omit-frame-pointer,否则从perf看到的栈是不完整的; 使用-O参数会omit frame pointer
- 一种解决no frame pointer的方法是添加--call-graph dwarf选项,不过需要perf支持
- 如果处理器支持LBR(last branch record),可以采用它来获取有限层的栈桢
- 或者重新编译perf来支持frame pointer
关于事件
引用来自Brendan的图片:

Hardware Events: CPU performance monitoring counters.
Software Events: These are low level events based on kernel counters. For example, CPU migrations, minor faults, major faults, etc.
Kernel Tracepoint Events: This are static kernel-level instrumentation points that are hardcoded in interesting and logical places in the kernel.
User Statically-Defined Tracing (USDT): These are static tracepoints for user-level programs and applications.
Dynamic Tracing: Software can be dynamically instrumented, creating events in any location. For kernel software, this uses the kprobes framework. For user-level software, uprobes.
Timed Profiling: Snapshots can be collected at an arbitrary frequency, using perf record -FHz. This is commonly used for CPU usage profiling, and works by creating custom timed interrupt events.
火焰图学习
Brendan在ACM Queue上文章
对mysql火焰图的一种案例分析: https://queue.acm.org/downloads/2016/Gregg4.svg
尽管perf或者dtrace能够产生栈桢信息用于调优,但有时文字太多仍不直观,无法方便学习和理解
火焰图的特点:
- 鼠标悬浮
- 可点击方块进行缩放
- ctrl+f查找函数名,并summing percentages
使用为三个步骤:
- 使用profiler如perf,dtrace产生profiling data
- 使用火焰图stackcollapse工具对上一步的output转换成folded 中间格式数据。目前此工具支持以下profiler: DTrace, Linux perf_events, FreeBSD pmcstat, Xperf, SystemTap, Xcode Instruments, Intel VTune, Lightweight Java Profiler, Java jstack, and gdb
- 执行flamegraph.pl perl脚本转换成SVG图片
典型用法是:
# git clone https://github.com/brendangregg/FlameGraph
# cd FlameGraph
# perf record -F 99 -a -g -- sleep 60
# perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > out.svg
flame chart也是一种工具,它的横轴是时间,可以大大降低merging,但不适合多线程profiling
火焰图面临的问题
- 栈桢不完整; 有些profiler会截断栈桢,导致frame merging fail;或者编译时omit frame pointer
- 函数名丢失,JIT代码这种情况比较多
- SVG文件大小太大,浏览器加载慢
Brendan火焰图主页
火焰图分析可以有以下几种:
- CPU
- memory
- off-cpu
- hot/cold
- 差分火焰图
火焰图x轴代表栈信息的population,通常按函数名进行排序,不是时间序;y轴表示栈深度;每一长方形代表一个stack frame,越宽代表出现得越多;顶端表示正在运行的函数,下方是它的祖先;火焰图颜色是随机划分的
差分火焰图(differential flame graph)
Cor-Paul的差分火焰图开源实现:http://corpaul.github.io/flamegraphdiff
Reference
性能分析之profiling及火焰图的更多相关文章
- Mysql系列(十)—— 性能分析工具profiling
转载自:http://www.ywnds.com/?p=8677 explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. ...
- Flask - 性能分析(Profiling,profiler,profile)
1. 疑问 @app.cli.command() @click.option('--length', default=25, help='Number of functions to include ...
- 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下
如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...
- Linux下用火焰图进行性能分析【转】
转自:https://blog.csdn.net/gatieme/article/details/78885908 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- 用 CPI 火焰图分析 Linux 性能问题
https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题 yangoliver 2018-02-11 16:05:53 浏览1076 ...
- 如何利用火焰图定位 Java 的 CPU 性能问题
常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...
- perf + Flame Graph火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- [转]perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
随机推荐
- 最全面的H5的背景音效素材(经过实践),分享给你!!!
个人内心独白: 这两天在为一个H5的页面寻找一些相关音效,茫茫的网络,辣么大,真是想法设法翻遍你,不说废话了,看总结吧哦 方法总结(这才是重点,看这里): 1.如果是部分铃声截取的,我们可以来到铃声之 ...
- jquery-时间轴滑动
效果预览图: html: <div class="tim"> <div class="timdiv"> <div class=&q ...
- 设计模式学习笔记——Composite 组合模式
用于描述无限层级的复杂对象,类似于描述资源管理器,抽象出每一个层级的共同特点(文件夹和文件,展开事件) 以前描述一个对象,是将整个对象的全部数据都描述清楚,而组合模式通过在对象中定义自己,描述自己的下 ...
- D. Shortest Cycle
D. Shortest Cycle A[i]&A[j]!=0连边, 求图中最小环 N>128 时必有3环 其他暴力跑 folyd最小环 #include<bits/stdc++.h ...
- React-Native 之 GD (七)下拉刷新 及 上拉加载更多
1.下拉刷新 使用第三方插件 下载插件: $ npm install react-native-pull@latest --save 引入: import {PullList} from 'reac ...
- CAS-4.2.7接入REST登录认证,移动端、C/S端登录解决方案
一.发送GET请求获取RSA公钥和JSESSIONID 请求地址:/cas/login,请求类型:GET curl -I http://cas.gfstack.geo:8080/cas/login 返 ...
- commons-collections包中的常用的工具类
commons-collections包中的常用的工具类 <dependency> <groupId>commons-collections</groupId> & ...
- GenericAPIView的使用及和视图扩展类的结合使用
GenericAPIView的使用 from rest_framework.generics import GenericAPIView GenericAPIView继承 APIView,主要增加了操 ...
- Delphi XE2 之 FireMonkey 入门(2)
FireMonkey 的控件都是自己绘制的(而不是基于系统组件), 我想它们应该是基于一些基本图形; 就从基本图形开始吧. FMX.Objects 单元给出的类: TShape //基本图形的基类 T ...
- 测开之路九十六:css进阶之元素显示和可见性
元素显示效果:display 块级元素,会导致换行:p.div.h...内联元素,不会导致换行:span.strong... 修改属性 让span标签换行 让指定div不换行 元素可见性:visibi ...