当前位置: 首页 > news >正文

性能分析利器:火焰图

什么是火焰图

        火焰图(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 监控数据消息中。 

http://www.lryc.cn/news/33365.html

相关文章:

  • 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
  • 概率论小课堂:条件概率和贝叶斯公式(机器翻译的工作原理)
  • 流量与日志分析
  • 英文论文写作常用例句整理汇总(持续更新)
  • [N0wayBack 练习题] My_enc,Euler,EasyLock,RRRRSA,EasyNumber,pwn
  • 网分线缆测试和dc-block
  • Java创建线程的方式只有一种:Thread+Runnable
  • 数据加密--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
  • 【GO】K8s 管理系统项目33[前端部分–登录和登出]
  • Vue 计算属性基础知识 监听属性watch
  • PAT:L1-004 计算摄氏温度、L1-005 考试座位号、L1-006 连续因子(C++)
  • Redis集群方案应该怎么做?
  • 连续点击返回键退出Android 应用
  • 【PyTorch】教程:torch.nn.Hardswish
  • nacos源码入门
  • 【记录】Samba|Windows 11的Samba连接切换用户
  • vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用
  • HBase常用Shell命令
  • 【阿里云】Apsara Clouder云计算专项技能认证-云服务器ECS入门,考试真题分享
  • 怎样编写java程序
  • 面向对象设计模式:结构型模式之适配器模式
  • Unity3D Shader系列之模板测试
  • 机器学习中的数学——精确率与召回率
  • Oracle启动数据库报ORA-01102解决办法
  • Go 语言面向对象编程及实践
  • 0102 MySQL05
  • [深入理解SSD系列 闪存2.1.3] 固态硬盘闪存的物理学原理_NAND Flash 的读、写、擦工作原理
  • 洗地机哪家强?洗地机排行榜
  • 【Java基础 下】 029 -- 多线程
  • R语言生物群落(生态)数据统计分析与绘图