性能分析利器:火焰图
什么是火焰图
火焰图(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 监控数据消息中。
性能分析利器:火焰图相关推荐
- mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
简述 Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack). 通常,它的执行频率是 99Hz(每秒99次), ...
- 【Linux性能分析】火焰图(Flame Graphs)的安装和基本用法
转载:火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs)的安装和基本用法 火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析 ...
- CentOS 7 Linux实时内核下的epoll性能分析后续 | 火焰图分析
在<CentOS 7 Linux实时内核下的epoll性能分析>从源码角度分析了epoll在实时内核和非实时内核之间的差异,为了更好的展示问题所在,这里给出epoll和select在实时内 ...
- Golang pprof 性能分析与火焰图
文章目录 1. 安装graphviz 1.1 下载 graphviz (windows 环境) 1.2 测试graphviz是否安装成功 2. 使用pprof 2.1 修改代码 2.2 火焰图生成 3 ...
- Go代码调优利器-火焰图
转自: https://lihaoquan.me/2017/1/1/Profiling-and-Optimizing-Go-using-go-torch.html Go代码调优利器-火焰图 go 调优 ...
- perf+火焰图 = 性能分析利器
perf 1. perf安装 sudo apt install linux-tools-common 检查是否安装好 perf 如果出现 You may need to install the fol ...
- 程序员精进之路:性能调优利器--火焰图
作者:厉辉,腾讯 CSIG 后台开发工程师 本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一 ...
- 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...
- 编程新手该如何调优程序?程序员必备性能调优利器——火焰图
本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...
最新文章
- ubuntu18.04.4 安装 dlib (解决 Running setup.py install for dlib ... error错误)
- 【转】在Java中连接字符串时是使用+号还是使用StringBuilder StringBuffer 加号
- [python学习] 简单爬取维基百科程序语言消息盒
- embedding_Keras嵌入层
- 什么叫补仓,什么是补仓
- YOLO系列专题——YOLOv3实践篇
- c++游戏编程100事列_C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码...
- 使用Word 2003“格式→外文版式→带圈字符”功能可以输入10以上带圈序号。
- Selenium控制已打开的chrome、IE浏览器
- win10 office提示‘VBE6EXT.OLB不能被加载‘怎么办
- python unpack java,Java中的python struct.unpack - java
- 最小生成树(Minimum Spanning Tree)
- Node.js检查路径是文件还是目录
- 矩阵键盘 多键组合 c语言,矩阵键盘的检测和独立按键有很大的区别
- 计算机教师帮扶记录,教师结对帮扶工作总结范文(通用6篇)
- 【Ant Design】图标大全(网断专用)
- 【Java进阶营】Java是什么?Java的特点有哪些?
- leetcode第88题“非递减顺序排列“是什么意思?
- 全球与中国PH传感器盒市场深度研究分析报告
- Gradient descent拙见
热门文章
- 双操作系统安装(七)Windows及Archlinux双系统安装教程
- 分享一个远程控制软件源代码
- h3c linux驱动 wn612_H3C iNode智能客户端安装指导(Linux)-7.3-5PW102
- docker 超级计算机,人们明知圆周率算不尽,但为什么超级计算机仍在不停地计算...
- 清除idea JetbrainsAgent插件
- 哈罗单车、美团单车、和滴滴青桔的新三国杀
- 视通科技音视频解决方案
- 一篇文章让你走进Java世界
- 服务器操作系统CoreOS初体验
- 《约翰·克里斯朵夫 》