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能够产生栈桢信息用于调优,但有时文字太多仍不直观,无法方便学习和理解

火焰图的特点:

  1. 鼠标悬浮
  2. 可点击方块进行缩放
  3. ctrl+f查找函数名,并summing percentages

使用为三个步骤:

  1. 使用profiler如perf,dtrace产生profiling data
  2. 使用火焰图stackcollapse工具对上一步的output转换成folded 中间格式数据。目前此工具支持以下profiler: DTrace, Linux perf_events, FreeBSD pmcstat, Xperf, SystemTap, Xcode Instruments, Intel VTune, Lightweight Java Profiler, Java jstack, and gdb
  3. 执行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)

Brendan在14年对差分火焰图的介绍

Cor-Paul的差分火焰图开源实现:http://corpaul.github.io/flamegraphdiff

Reference

  1. Brendan Gregg对perf的博文介绍。内容很丰富,不要错过

性能分析之profiling及火焰图的更多相关文章

  1. Mysql系列(十)—— 性能分析工具profiling

    转载自:http://www.ywnds.com/?p=8677 explain是从mysql怎样解析执行sql的角度分析sql优劣.profiling是从sql执行时资源使用情况的角度来分析sql. ...

  2. Flask - 性能分析(Profiling,profiler,profile)

    1. 疑问 @app.cli.command() @click.option('--length', default=25, help='Number of functions to include ...

  3. 超好用的自带火焰图的 Java 性能分析工具 Async-profiler 了解一下

    如果你经常遇到 Java 线上性能问题束手无策,看着线上服务 CPU 飙升一筹莫展,发现内存不断泄露满脸茫然.别慌,这里有一款低开销.自带火焰图.让你大呼好用的 Java 性能分析工具 - async ...

  4. Linux下用火焰图进行性能分析【转】

    转自:https://blog.csdn.net/gatieme/article/details/78885908 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  5. 用 CPI 火焰图分析 Linux 性能问题

    https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题   yangoliver 2018-02-11 16:05:53 浏览1076 ...

  6. 如何利用火焰图定位 Java 的 CPU 性能问题

     常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...

  7. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  8. [转]perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  9. perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

随机推荐

  1. Installing MacOS to VirtualBox

    https://medium.com/@twister.mr/installing-macos-to-virtualbox-1fcc5cf22801

  2. F5设备部署

    旁挂组网(组网模式一) 所谓旁挂组网模式,就是指在BIG-IP LTM上只配置一个Vlan,使用一个端口(或者Trunk端口)连接在网络中,所有的处理均在这一个Vlan中运行.通常有三种常见配置模式. ...

  3. linux运维、架构之路-MySQL(二)

    一.SQL语句实战 1.DDL语句——库管理 ①查看数据库 show databases; show databases like 'word%';#模糊查询数据库 ②创建数据库 create dat ...

  4. BZOJ 2288: 【POJ Challenge】生日礼物 贪心 + 堆 + 链表

    好像是模拟费用流 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r" ...

  5. POJ 3061 Subsequence ( 二分 || 尺取法 )

    题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...

  6. matplotlib中中文字体配置

    解决方式1:利用matplotlib的字体管理工具font_manager---->缺点:每次必须要进行设置 import matplotlib.pyplot as plt from matpl ...

  7. Spring MVC Captcha 验证码

    本文专为不想一遍遍手写验证码代码的”懒猿“而生,只需要添加部分配置文件,拷贝一个控制层代码,就能在页面中方便使用.话不多说,进入主题: 一. Spring MVC 环境实现方式: 1.1 spring ...

  8. Linux相关基础知识

    文件目录 /bin 放置系统执行档的目录,指令可被root与一般账户所使用. /boot 放置开机使用到的文档,包括linux核心档案,开机选单与所需设定档. /dev 任何装置与周边设备都是以档案的 ...

  9. [CSP-S模拟测试]:导弹袭击(数学+凸包+单调栈)

    题目背景 $Guess$准备向敌军阵地发起进攻了!$Guess$的武器是自动制导导弹.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降维打击,结果... 题目描述 众所周知,环境因素对导 ...

  10. Oracle 10046 event

    http://czmmiao.iteye.com/blog/1497509 10046事件概述Oracle的10046事件,可以跟踪应用程序所执行的SQL语句,并且得到其解析次数.执行次数,CPU使用 ...