[转帖]【初探】java性能火焰图的生成

初探,java,性能,火焰,生成 · 浏览次数 : 0

小编点评

**一、前言** - 准备环境:Linux系统机器或虚拟机一台,安装的软件:git、jdk、perl。 **二、火焰图的绘制** - FlameGraph 是一种用于绘制计算机程序运行时性能问题的工具。 - 它使用异步性能分析工具(async-profiler)收集和解析数据文件生成火焰图。 **三、使用 async-profiler 安装和运行** - 下载并编译 async-profiler 文件。 - 启动 async-profiler,输入命令进行编译。 - 编写一个简单的 Java 程序运行并获取其进程 ID。 **四、生成火焰图数据** - 使用 `./profiler.sh` 命令生成火焰图数据。 - 指定持续时间、输出格式和文件路径。 **五、分析火焰图** - 使用 `flamegraph.pl` 等工具读取和解析数据文件生成火焰图。 - 可通过浏览器打开火焰图文件以查看性能问题。 **六、其他相关命令** - `ps -ef | grep javaroot`: 列出与 Java 进程相关的进程。 - `jps -d 60 -o collapsed -f /tmp/test_01.txt ${pid}`: 使用 JPS 命令查看进程信息。 - `perl flamegraph.pl --colors=java /tmp/test_01.txt > test_01.svg`: 使用 Perl 生成火焰图文件。 **七、火焰图解释** - flamegraph 图像上x轴显示调用顺序,y轴显示栈深,颜色表示 CPU 执行方法的占比。 - 栈底方法的宽度较宽,表示其性能问题更严重。 - 火焰图呈现“┻”型,表示栈底方法存在性能问题。

正文

https://www.cnblogs.com/hama1993/p/10580581.html

 

一、前言

开始之前,你需要准备的环境:

Linux系统机器或者虚拟机一台,里面需要安装的软件:git、jdk、perl


二、简单介绍

java性能分析火焰图的所做的事情就是能够分析出java程序运行期间存在的性能问题,因为某段代码拖慢整个程序执行是不允许的,因此靠火焰图的绘制和分析就可以找出类似的“问题代码段”。

那么这个图是怎么来的呢?首先跟大多数监控系统一样,数据采集+前端绘图,这个图也是根据某些数据绘制而成的,绘图工具本篇文章采用FlameGraph,而负责收集这些数据的工具,本篇采用async-profiler,这个工具会在程序运行期间向jvm发送信号采集其运行期数据(简单来说就是通过该工具可以找出程序中占用CPU资源时间最长的代码块,这里async-profiler的实现使用了jvmti,戳这里简单了解一下),然后生成相应的数据格式文件,而FlameGraph则负责读取和解析数据文件生成对应的火焰图(svg文件)。


三、使用&安装

🔥3.1:环境搭建

确认你的机器已经安装了git、jdk、perl、c++编译器,部分可参考:安装杂记

🔥3.2:clone相关项目

下载下来所需要的两个项目(这里建议放到data目录下):


git clone https://github.com/jvm-profiling-tools/async-profiler
git clone https://github.com/brendangregg/FlameGraph

🔥3.3:编译

下载好以后,需要打开async-profiler文件,输入make指令进行编译:


cd async-profiler
make

🔥3.4:编写测试程序

编译完成后,我们来写一个简单的java程序:


public class Test {

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        while (true) {
            test.func1();
            test.func2();
            test.func3();
        }
    }

    public void func1() throws Exception { //调用第一个方法,需要100ms
        Thread.sleep(100L);
    }

    public void func2() throws Exception { //调用第二个方法,需要500ms
        Thread.sleep(500L);
    }

    public void func3() throws Exception { //调用第三个方法,需要1500ms
        Thread.sleep(1500L);
    }

}

非常简单的一个java类,main方法里所做的事情也很简单,现在把这个文件搞到data目录下,javac命令编译,java命令启动。

然后找到这个java程序的进程id:


ps -ef | grep java
root     30937 17605  0 19:12 pts/0    00:00:00 java Test
root     30961 23135  0 19:12 pts/1    00:00:00 /bin/grep --color=auto java

可以确认此时Test类运行时的java进程 pid = 30937,当然也可以使用jps命令直接查看java进程,效果是一样的。

🔥3.5:生成火焰图数据

ok,上述步骤完成后,现在进入async-profiler那个项目的目录下,然后输入如下指令:


./profiler.sh -d 60 -o collapsed -f /tmp/test_01.txt ${pid}

上面的-d表示的是持续时长,后面60代表持续采集时间60s,-o表示的是采集规范,这里用的是collapsed,-f后面的路径,表示的是数据采集后生成的数据存放的文件路径(这里放在了/tmp/test_01.txt),${pid}表示的是采集目标进程的pid,也就是上面提到的30937

回车运行,运行期间阻塞,知道约定时间完成。运行完成后,现在去tmp下看看有没有对应文件:

🔥3.6:生成svg文件

上一步产生的文件里的内容,肉眼是很难看懂的,所以现在FlameGraph的作用就体现出来了,它可以读取该文件并生成直观的火焰图,现在进入该项目目录下面,执行如下语句:


perl flamegraph.pl --colors=java /tmp/test_01.txt > test_01.svg

因为是perl文件,这里使用perl指令运行该文件,后面--colors表示着色风格,这里是java,后面的是数据文件的路径,这里是刚刚上面生成的那个文件/tmp/test_01.txt,最后的test_01.svg就是最终生成的火焰图文件存放的路径和文件命名,这里是命名为test_01.svg并保存在当前路径,运行后看到该文件已经存在于当前目录下:

🔥3.7:展示

现在下载下来该文件,使用浏览器打开,效果如下:

果然还是看不懂啊-_-||

后续会更新这东西怎么看和分析,或者说我这篇文章里的java例子可能并不能很好的体现出什么。


续更

续更,公司内部火焰图已经上线,通过更为复杂的业务场景生成的图反而看起来更容易理解一些,因为业务代码的调用也会打印出来,下面贴一下内部某业务系统火焰图:

 

这张图是在某个业务系统运行时,采样60s生成的火焰图,通过这样一张图可以看出,x轴为调用顺序,y轴为栈深,线条颜色无实际意义(并不是越红性能越差之类的),线条长度代表CPU执行该方法时所花费的时间占比,一般来说需要关注的就是栈顶,且宽度比较大的那个。因为一般处于栈顶的,而且宽度比较大的调用栈,说明其存在性能问题,这样分析的原因如下:

栈深度与y轴高度成正比,一般造成性能问题的都在调用栈的栈顶位置,因为栈顶位置的性能问题会间接拖慢整个调用栈,比如上图中每个栈底的线条都很长,这是因为越往上栈越深,对下层的影响就越大,可以简单抽象成方法调用:A调用B,B调用C,C慢会间接导致B慢,从而导致A慢,当然符合这种情况就适合之前说的看栈顶分析瓶颈的方法,如果A本身就慢呢?通过火焰图也是可以看出来的,比如栈底的线条宽度很宽,但是建立在该栈底的调用链上,线条都很窄,火焰图呈现“┻”型,那么就可以认定,栈底方法存在性能问题,一般情况下都是从栈顶看起,视情况而定~

 
分类: 杂记监控相关

与[转帖]【初探】java性能火焰图的生成相似的内容:

[转帖]【初探】java性能火焰图的生成

https://www.cnblogs.com/hama1993/p/10580581.html 一、前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git、jdk、perl。 二、简单介绍 java性能分析火焰图的所做的事情就是能够分析出java程序运行期

[转帖]【初探】java性能火焰图的生成

https://www.cnblogs.com/hama1993/p/10580581.html 一、前言 开始之前,你需要准备的环境: Linux系统机器或者虚拟机一台,里面需要安装的软件:git、jdk、perl。 二、简单介绍 java性能分析火焰图的所做的事情就是能够分析出java程序运行期

[转帖]初步探索GraalVM——云原生时代JVM黑科技

https://baijiahao.baidu.com/s?id=1749705890892955339&wfr=spider&for=pc 1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但

[转帖]【JVM系列JKD8】参数参考表

JVM是Java底层核心要素,可以说Java生态的东西都是运行在JVM里面的。From:https://docs.oracle.com/javase/8/docs/ JVM参数的含义 JVM参数说明 参数名称含义默认值-Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRat

[转帖]初探Linux CPU动态调频与实测

https://zhuanlan.zhihu.com/p/33753019 关于 本文主要涉及Linux CPUFreq子系统是什么,为什么需要,怎么用。 并解决在实际测试中遇到的三个问题: scaling_governor没有userspace的问题。 /proc/cpuinfo与cpuinfo_

[转帖]龙芯处理器应用于服务器的性能初探

https://zhuanlan.zhihu.com/p/585350070 自从今年龙芯3C5000+7A2000面世以来,在服务器市场已经具备初步的竞争力。在11月16日南京的会议中,龙芯发布了几十款服务器与台式机产品。一直以来,服务器CPU给人的感觉比较高端,价格也要贵好几倍,一个INTEL的

[转帖]虚拟化: 物理CPU与VCPU的关系 || 内存上限说起 VMware内存分配初探

本文章整合了一下(vSphere&FusionSphere)内存的相关知识: 1.虚拟化CPU与VCPU关系 2.虚拟化的内存分配 1、vSphere 物理CPU与VCPU的关系 为方便识别虚拟的资源和物理(或叫真实的)资源,本人文章中以小写字母v前缀标识虚拟资源,小写字母p前缀标识物理资源。例如:

[转帖]初识SkyWalking

https://zhuanlan.zhihu.com/p/361579294 一、SkyWalking 是什么? 一个开源的可观测平台,用于从服务和云原生基础设施收集,分析, 聚合及可视化数据。 SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至横跨多个云平台。SkyWalkin

[转帖]初识SkyWalking

https://zhuanlan.zhihu.com/p/361579294 一、SkyWalking 是什么? 一个开源的可观测平台,用于从服务和云原生基础设施收集,分析, 聚合及可视化数据。 SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至横跨多个云平台。SkyWalkin

[转帖](一)初步认识固态硬盘

https://zhuanlan.zhihu.com/p/411975714 一、固态硬盘是什么? 固态硬盘是用固态电子存储芯片阵列制成的硬盘,简称SSD。固态硬盘的接口规范、定义、功能和使用方法与普通硬盘完全相同,在外形和尺寸上基本与普通硬盘一致。 SATA固态 二、固态硬盘的发展历程 固态硬盘最