什么是火焰图

火焰图(FlameGraph)是是由 Linux 性能优化大师 Brendan Gregg 发明的。通过 perf 等工具分析得到结果,看起来就像是火焰,这也是它的名字的由来。火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。

火焰图就像是给一个软件系统拍的 X 光照片,可以很自然地把时间和空间两个维度上的信息融合在一张图上,以非常直观的形式展现出来,从而反映系统在性能方面的很多定量的统计规律。

火焰图类型

ON-CPU和OFF-CPU

off-CPU 时间一般是这个进程因为某种原因处于休眠状态,比如说在等待某一个系统级别的锁,或者被一个非常繁忙的进程调度器(scheduler)强行剥夺 CPU 时间片。通过这个维度上的信息,我们可以分析系统锁方面的开销(比如 sem_wait 这样的系统调用),某些阻塞的 I/O 操作(例如 open、read 之类),还可以分析进程或线程之间争用 CPU 的问题。通过 off-CPU 火焰图,都一目了然。

如何看懂火焰图

y 轴表示调用栈, 每一层都是一个函数。调用栈越深, 火焰就越高, 顶部就是采样时正在执行的函数, 下方都是它的父函数。

x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长,说明它是瓶颈原因的可能性就越大。注意, x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。

无意义的事情:横向先后顺序是为了聚合,跟函数间依赖或调用关系无关;火焰图各种颜色是为方便区分,本身不具有特殊含义。

其他的采样方式也可以使用火焰图, on-cpu 火焰图横轴是指 cpu 占用时间,off-cpu 火焰图横轴则代表阻塞时间。不同类型火焰图适合优化的场景不同,比如 on-cpu 火焰图适合分析 cpu 占用高的问题函数,off-cpu 火焰图适合解决阻塞和锁抢占问题。

案例

on-cpu 火焰图

在进行压测时,发现QPS 急剧下降,在其 CPU (四十八核)占用率几乎达到 100%的情况下只有几千 QPS,通过绘制火焰图发现,其主要耗时在一个 table 插入阶段(lj_cf_table_insert),分析代码发现是该 table 一直没有释放,每次匹配不中路由会插入数据,导致表越来越大,后续插入耗时过长导致 QPS 下降。

off-cpu 火焰图

这是一张 nginx 的 off-cpu 火焰图,我们可以很快锁定到 ngx_common_set_cache_fs_size -> ngx_shmtx_lock -> sem_wait 这段逻辑使用到了互斥锁,它让 nginx 进程绝大部分阻塞等待时间花费在获取该锁。

这是一张 agent 的 off-cpu 火焰图,它是一个多线程异步事件模型,主线程处理各个消息,多个线程分别负责配置下发或者监控上报的职责。当前问题出现在监控上报性能差,无法在周期(一分钟)内完成监控数据上报,导致监控断点,通过 off-cpu 火焰图我们可以分析出,该上报线程花费了大量的时间使用 curl_easy_perform 接口收发 http 监控数据消息中。

性能分析利器:火焰图相关推荐

  1. mysql火焰图_Linux 性能分析利器 -火焰图 flame graph

    简述 Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack). 通常,它的执行频率是 99Hz(每秒99次), ...

  2. 【Linux性能分析】火焰图(Flame Graphs)的安装和基本用法

    转载:火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析 ...

  3. CentOS 7 Linux实时内核下的epoll性能分析后续 | 火焰图分析

    在<CentOS 7 Linux实时内核下的epoll性能分析>从源码角度分析了epoll在实时内核和非实时内核之间的差异,为了更好的展示问题所在,这里给出epoll和select在实时内 ...

  4. Golang pprof 性能分析与火焰图

    文章目录 1. 安装graphviz 1.1 下载 graphviz (windows 环境) 1.2 测试graphviz是否安装成功 2. 使用pprof 2.1 修改代码 2.2 火焰图生成 3 ...

  5. Go代码调优利器-火焰图

    转自: https://lihaoquan.me/2017/1/1/Profiling-and-Optimizing-Go-using-go-torch.html Go代码调优利器-火焰图 go 调优 ...

  6. perf+火焰图 = 性能分析利器

    perf 1. perf安装 sudo apt install linux-tools-common 检查是否安装好 perf 如果出现 You may need to install the fol ...

  7. 程序员精进之路:性能调优利器--火焰图

    作者:厉辉,腾讯 CSIG 后台开发工程师 本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一 ...

  8. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

    本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...

  9. 编程新手该如何调优程序?程序员必备性能调优利器——火焰图

    本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...

最新文章

  1. ubuntu18.04.4 安装 dlib (解决 Running setup.py install for dlib ... error错误)
  2. 【转】在Java中连接字符串时是使用+号还是使用StringBuilder StringBuffer 加号
  3. [python学习] 简单爬取维基百科程序语言消息盒
  4. embedding_Keras嵌入层
  5. 什么叫补仓,什么是补仓
  6. YOLO系列专题——YOLOv3实践篇
  7. c++游戏编程100事列_C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码...
  8. 使用Word 2003“格式→外文版式→带圈字符”功能可以输入10以上带圈序号。
  9. Selenium控制已打开的chrome、IE浏览器
  10. win10 office提示‘VBE6EXT.OLB不能被加载‘怎么办
  11. python unpack java,Java中的python struct.unpack - java
  12. 最小生成树(Minimum Spanning Tree)
  13. Node.js检查路径是文件还是目录
  14. 矩阵键盘 多键组合 c语言,矩阵键盘的检测和独立按键有很大的区别
  15. 计算机教师帮扶记录,教师结对帮扶工作总结范文(通用6篇)
  16. 【Ant Design】图标大全(网断专用)
  17. 【Java进阶营】Java是什么?Java的特点有哪些?
  18. leetcode第88题“非递减顺序排列“是什么意思?
  19. 全球与中国PH传感器盒市场深度研究分析报告
  20. Gradient descent拙见

热门文章

  1. 双操作系统安装(七)Windows及Archlinux双系统安装教程
  2. 分享一个远程控制软件源代码
  3. h3c linux驱动 wn612_H3C iNode智能客户端安装指导(Linux)-7.3-5PW102
  4. docker 超级计算机,人们明知圆周率算不尽,但为什么超级计算机仍在不停地计算...
  5. 清除idea JetbrainsAgent插件
  6. 哈罗单车、美团单车、和滴滴青桔的新三国杀
  7. 视通科技音视频解决方案
  8. 一篇文章让你走进Java世界
  9. 服务器操作系统CoreOS初体验
  10. 《约翰·克里斯朵夫 》