性能调优工具-火焰图

发布时间:2019-07-17 19:29,

浏览次数:402

前言

工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度。这也是我为什么非常喜欢

shell 的原因,它丰富的命令行工具集加管道特性处理起文本数据集来真的精准而优雅,让人迷醉。

但很多时候文本的表现力非常有限,可以说匮乏,表达绝对值时,自然是无往不利,但在展示相对值时,就有些捉襟见肘了,就更不用说多维数据了。我们用 shell

可以非常快速地查询出文本内的累加值、最大值等,但一遇到两组值的相关性分析时,就束手无策了。这个时候,就需要使用另一种分析工具 – 图

了,如散点图就能很清晰地展示相关性。

今天就准备介绍一种图,火焰图,之前组内大神分享过它的使用办法,但我之后很久都没有用过,以至于对它没有什么深刻印象,最近排查我们 Java

应用负载问题时试用了一下,这才对它的用途有了点心得。

转载随意,文章会持续修订,请注明来源地址:https://zhenbianshu.github.io

介绍

引子

在排查性能问题时,我们通常会把线程栈 dump 出来,然后使用 grep --no-group-separator -A 1

java.lang.Thread.State jstack.log | awk 'NR%2==0' | sort | uniq -c | sort -nr

类似的 shell 语句,查看大多数线程栈都在干什么。而由线程栈的出现频率,来推断 JVM 内耗时最多的调用。

至于其原理,设想广场上有一个大屏幕在不停地播放各种广告。如果我们随机对大屏幕拍照,次数多了,统计照片中各个广告出现的频率,基本可以得出每个广告的播放时长占比了。而我们应用的资源就像大屏幕,每次调用就像是播放一次广告,统计

dump

出的线程栈出现比例,也就基本能看出线程栈的耗时占比,虽然有误差,但是多次统计下应该差不了多少。这也就是为什么有些家长每次进孩子房间都发现孩子在看系统桌面后以为孩子平时喜欢对着桌面发呆的原因。

:)

2444 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass

(WebappClassLoaderBase.java:1200) 1587 at sun.misc.Unsafe.park(Native Method)

795 at java.security.Provider.getService(Provider.java:1035) 293 at

java.lang.Object.wait(Native Method) 292 at java.lang.Thread.sleep(Native Method

) 73 at

org.apache.logging.log4j.core.layout.TextEncoderHelper.copyDataToDestination

(TextEncoderHelper.java:61) 71 at sun.nio.ch.EPollArrayWrapper.epollWait(Native

Method) 70 at java.lang.Class.forName0(Native Method) 54 at

org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover

(RollingFileManager.java:217)

但是这样有些问题,首先写 shell 挺费事的,另外如果我想查看自栈顶第二个栈的最多调用,即使修改了 shell 命令,结果也不直观。

产生这个问题的主要原因是,我们的线程栈是有调用关系的,即我们需要考虑线程栈的 调用链 和 出现频率

两个维度,而单一的文本表现这两种维度比较困难,所以,著名性能分析大师 brendan gregg 就提出了火焰图。

介绍

火焰图,因其形似火焰而得名,其开源代码地址在 Github-brendangregg-Flamegraph

它是一种 svg

可交互式图形,我们通过点击和鼠标指向可以展示出更多的信息。下图就是一个典型的火焰图,从结构上,它是由多个大小和颜色各异的方块构成,每个方块上都有字符,它们底部连接在一块,组成火焰的基底,顶部分出许多”小火苗”。

当我们点击方块时,图片会从我们点击的方块为基底向上展开,而我们鼠标指向方块时,会展示出方块的详细说明。

特性

介绍火焰图的分析前,我们要首先说明它的特性:

* 由底部到顶部可以追溯一个唯一的调用链,下面的方块是上面方块的父调用。

* 同一父调用的方块从左到右以字母序排列。

* 方块上的字符表示一个调用名称,括号内是火焰图指向的调用在火焰图中出现的次数和这个方块占最底层方块的宽度百分比。

* 方块的颜色没有实际意义,相邻方块的颜色差只为了便于查看。

分析

那么,给我们一张火焰图,我们怎么能看出系统哪里有问题呢?

由上文中的火焰图特性特性,查看火焰图时,我们最主要的关注点要放在方块的宽度上,因为宽度代表了调用栈在全局出现的次数,次数代表着出现频率,而频率也就可以说明耗时。

但是观察火焰图底部或中部方块的宽度占比意义不大,如上面的火焰图,中部的 do_redirections 函数宽度是

24.87%,也就是说它耗用了整个应用近四分之一的时间,但是真正消耗时间的并不是 do_redirections 函数,而是 do_redirections

内部又调用的其他函数,而它的子调用分为了很多个,每个调用的耗时并没有异常。

我们更应该关注的是火焰图顶部的一些 “平顶山”,顶部说明它没有子调用,方块宽说明它耗时长,长时间 hang

住,或者被非常频率地调用,这种方块指向的调用才是性能问题的罪魁祸首。

找到了异常调用,直接优化它,或者再根据火焰图的调用链层层向下,找到我们的业务代码进行优化,也就大功告成。

应用场景

每种工具都有其适合的应用场景,火焰图则适合用在:

*

代码循环分析:如果代码中有很大的循环或死循环代码,那么从火焰图的顶部或接近项部的地方会有很明显的”平顶”,表示代码频繁地在某个线程栈上下切换。但需要注意的是,如果循环的总耗时不长,在火焰图上不会很明显。

* IO 瓶颈/锁分析:在我们的应用代码中,我们的调用普遍都是同步的,也就是说在进行网络调用、文件 I/O

操作或未成功获得锁时,线程会停留在某个调用上等待 I/O 响应或锁,如果这个等待非常耗时,会导致线程在某个调用上一直 hang

住,这在火焰图上表现得会非常清晰。 与此相对的是,我们应用线程构成的火焰图无法准确地表达 CPU 的消耗,因为应用线程内没有系统的调用栈,在应用线程栈

hang 住时,CPU 可能去做其他事了,导致我们看到耗时很长,而 CPU 却很闲。

* 火焰图倒置分析全局代码:火焰图倒置有时也会很实用,如果我们的代码 N

个不同的分支都调用某一方法,倒置后,所有栈顶相同的调用被合并在一块,我们就能看出这个方法的总耗时,也就很容易评估出优化这个方法的收益。

实现

既然火焰图这么强大,那么我们该怎么实现呢?

生成工具

brendan gregg 大神已经把生成火焰图的方法用 perl 实现了,开源代码就在上文的 Github 仓库中,根目录下的 flamegraph.pl

文件就是可执行的 perl 文件了。

这个命令还可以传入各种参数,支持我们修改火焰图的颜色、大小等 。

但 flamegraph.pl 只能处理特定格式的文件,像:

a;b;c 12 a;d 3 b;c 3 z;d 5 a;c;e 3

前面是调用链,每个调用之间用 ; 隔开,每行后面的数字是调用栈出现的次数。

如上面的数据,用 flamegraph.pl 生成的火焰图如下图:

数据准备

至于我们的 jstack 信息如何被处理成上面的格式,大神则为常见的 dump 格式都提供了工具,像 stackcollapse-perf.pl可以处理

perf 命令的输出,stackcollapse-jstack.pl 处理 jstack 输出,stackcollapse-gdb.pl 处理 gdb

输出的栈等。

也可以用 shell 简单地实现一下 jstack 的处理方式:

grep -v -P '.+prio=\d+ os_prio=\d+' | grep -v -E 'locked

($0==""){print $0}else{printf"%s;",$0}}' | sort | uniq -c | awk

'{a=$1;$1="";print $0,a}'

小结

火焰图总结完了,以后再遇到性能问题又多了一种应对方式。

做开发越久,越能感受得到工具的重要性,所以我准备加一个专题来专门介绍我使用的各种工具。当然,这也就更需要我更多地了解、使用和总结新的工具了。

关于本文有什么疑问可以在下面留言交流,如果您觉得本文对您有帮助,欢迎关注我的 微博  或

GitHub  。您也可以在我的 博客REPO

右上角点击 Watch 并选择 Releases

only 项来 订阅 我的博客,有新文章发布会第一时间通知您。

java 性能 火焰图_性能调优工具-火焰图相关推荐

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

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

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

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

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

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

  4. Java应用性能调优工具介绍及实践

    一.背景 (1).随着微服务架构的逐渐推广,一个大型的单个应用程序被拆分为数个微服务系统,这为研发人员的本地调试跟踪带来困难 (2).在微服务架构中,由于业务的复杂性,常常一个业务流程涉及好数个微服务 ...

  5. Linux性能调优工具-9张图-包你用到爽!抓紧收藏吧

    这里包含Linux 性能资料的工具图.这些使用大字体可以用作海报幻灯片.也可以将它们打印出来贴在办公室墙上.它们展示了:Linux 可观察性工具. Linux 静态性能分析工具. Linux 基准测试 ...

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

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

  7. 编写一个能监控到windows进程占用内存大小的脚本_Java性能监控分析及调优工具...

    >>>推荐阅读<<< 1.性能测试学习笔记-场景设计 2.性能测试的重要意义 3.性能分析流程及方法 4.应用系统性能调优之性能分析 Java性能监控分析及调优工具 ...

  8. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)...

    2019独角兽企业重金招聘Python工程师标准>>> 前提概要:         JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外 ...

  9. JVM性能调优(4)——性能调优工具

    目录 一.JDK工具1.JDK工具2.利用 jps 找出进程3.利用 jstat 查看VM统计信息4.利用 jmap 查看对象分布情况5.利用 jstack 分析线程栈 二.Linux 命令行工具1. ...

最新文章

  1. 小程序组件 Vant Weapp 安装
  2. Linux系统的中断、系统调用和调度概述【转】
  3. [动态代理三部曲:上] - 动态代理是如何坑掉了我4500块钱
  4. discuz 如何去掉自定义表情
  5. PX4代码解析(2)
  6. Spring框架----AOP的概念及术语
  7. 微软Tech·Ed与中国IT行业一同成长
  8. 洛谷 P1036 [NOIP2002 普及组] 选数(DFS)
  9. Java不满足的依赖异常_java – 新的缺失/不满足的依赖项WildFly 9中的错误
  10. 七张王牌助你做人做事顺遂成功
  11. 物体检测学习笔记-3D相机成像原理简介
  12. 电商后台管理系统技术总结(黑马)
  13. 我为什么从外包公司离职了?
  14. 计算机课程没电脑怎么讲课,停课不停学,学生家里没有电视、智能手机和电脑,怎么上网课?...
  15. 中国航空公司特点机型
  16. python requests默认超时时间_requests获取响应时间和超时
  17. 小爱同学语音API(不需要小米账号)
  18. 如何将 Excel 单元格内容按换行符拆分为多列
  19. 打工妹变身董事长,是早有预谋还是认知使然——解密《天道》肖亚文逆袭之路
  20. 小程序前端view内容重叠问题

热门文章

  1. 设定行车路线实验matlab,避障最优路径系统研究
  2. java 2分钟_Java怎么判断他是否在2分钟内执行了任务?
  3. Chrome浏览器无法启动,因为应用程序的并行配置不正确
  4. c语言中符号起什么作用,C语言中的符号 和 | 是什么意思?
  5. VUE+WebPack游戏设计:欲望都市,构建类RPG游戏的开发
  6. bzoj 1814: Ural 1519 Formula 1【插头dp】
  7. 云计算机是什么原理,云电脑的运行原理是什么?
  8. MSDN(VS2010版)使用问题小记
  9. Swin Transformer代码讲解
  10. 喜马拉雅转道港交所:上半年亏损3个亿,负债200亿元,现金流紧张