【转载】火焰图安装使用
转自文章:http://armsword.com/2021/03/23/use-async-profiler-find-cpu-bottleneck/
初识火焰图
Perf 的原理是这样子的:每隔一个固定的时间,就在 CPU 上(每个核上都有)产生一个中断,在中断上看看,当前是哪个 pid,哪个函数,然后给对应的 pid 和函数加一个统计值,这样,我们就知道 CPU 有百分几的时间在某个 pid,或者某个函数上了。而火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。
火焰图整个图形看起来就像一个跳动的火焰,这就是它名字的由来。火焰图有以下特征(这里以采样CPU 火焰图为例):
每一列代表一个调用栈,每一个格子代表一个函数。
纵轴展示了栈的深度,按照调用关系从下到上排列。最顶上格子代表采样时,正在占用 CPU 的函数
横轴的意义是指:火焰图将采集的多个调用栈信息,并行关系。横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。
火焰图格子的颜色是随机的暖色调,方便区分各个调用信息。
其他的采样方式也可以使用火焰图, 比如内存
所以,火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”,就表示该函数可能存在性能问题,也是我们性能优化收益最大的地方。
Java生态常见的用于perf的工具有:allocation-instrumenter、YourKit Profiler、async-profiler、JProfiler、Arthas(基于 async-profiler )。笔者推荐使用阿里巴巴出品的 Arthas 或 async-profiler,笔者喜欢使用 async-profiler 这个 perf 工具生成火焰图,主要原因是用法简单,足够满足日常排查性能问题了。
async-profiler 介绍
Async-profiler是一款没有 Safepoint bias problem 的低开销 Java 采集分析器,它的实现是基于HotSpot 特有的 API,通过这些特有的 API 收集堆栈跟踪和跟踪内存分配,因而其可以和 OpenJDK、Oracle JDK 和其他基于 HotSpot JVM 的 Java 应用在运行时协同工作。
Async-profiler 可以跟踪以下类型的事件:
CPU 周期;
硬件和软件性能计数器,如 cache misses, branch misses, page faults, context switches 等;
Java 堆中的分配;
锁尝试,包括 Java 对象监视器和可重入锁;
支持的平台
Linux / x64 / x86 / ARM / AArch64
macOS / x64
并且 IntelliJ IDEA Ultimate 2018.3 之后的版本也集成了 async-profiler。Github 项目链接地址:https://github.com/jvm-profiling-tools/async-profiler
主页上有已经编译好的包,找到对应的平台下载即可:
async-profiler 使用
下载好的文件解压后,有一个profiler.sh脚本,运行脚本即可对 Java 进程进行 CPU 分析。例如 Presto 的 Java 进程 id 为 8983。
$ jps
9234 Jps
8983 PrestoServer
$ ./profiler.sh start 8983
$ ./profiler.sh stop 8983
或者可以用-d指定剖析的时间(秒),我们将其重定向到一个文本文件里。
./profiler.sh -d 30 8983 > 8983.txt
执行完成后会输出采集的信息,这些信息可以帮我看到详细的函数调用逻辑,这非常有用,因为假如你新接触一个新的 OLAP 引擎,想快速入门,比如想了解其读写流程及代码执行流程,通过这些采集信息就可以快速帮我们捋清楚执行流程,如下:
如果你想生成火焰图,只需要执行如下命令即可:
$ ./profiler.sh -d 30 -f /tmp/flamegraph.html 8983
生成的svg火焰图如下图所示:
从上图我们可以看到大约 91.63% 的CPU用于GC,如果当前系统 CPU 使用率比较高,那就说明这些 CPU 没有在干正事,都耗费在 GC 里了,当前服务的主要瓶颈在 JVM 层,需要找下 JVM 瓶颈
event 参数介绍
event 可选参数使用如下命令查看,不同 CPU 支持的 event 是不一样的。
./profiler.sh list list 8983
输出结果:
[presto@localhost ~]$ ./profiler.sh list list 8983
Basic events:cpualloclockwallitimer
Perf events:page-faultscontext-switchescyclesinstructionscache-referencescache-missesbranchesbranch-missesbus-cyclesL1-dcache-load-missesLLC-load-missesdTLB-load-missesmem:breakpointtrace:tracepoint
event 默认为 cpu ,假如想查看内存分配,可以使用 alloc 查看,命令如下:
./profiler.sh -e alloc -d 30 -f /tmp/flamegraph.svg 8983
火焰图如下:
如上图所示,可以看到内存占用主要包括三大部分:Presto执行、数据交互及读取HDFS,知道这些信息后,我们就可以针对性的优化了。
使用过程中常见的问题
在使用 Async-profiler 过程中,我们有时候会遇到如下错误:
Could not start attach mechanism: No such file or directory
这是因为 Java 程序第一次执行 jmap 或 jstack 等 perf 命令后会在 /tmp 下创建 socket 文件,socket 文件路径为 /tmp/.java_pidXXX,但是操作系统默认 10 天会删除这个临时文件,之后再执行 perf 命令就不行了,解决方法是在 /usr/lib/tmpfiles.d/tmp.conf 中添加 x /tmp/.java* ,这样就不会删除这个 socket 文件了。
【转载】火焰图安装使用相关推荐
- openresty火焰图安装
1.下载systemtap安装包并安装 从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 我安装的时候, ...
- Flame Graphs 火焰图安装与使用
一.火焰图概述 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 ...
- FlameScope 更高级全面的火焰图
FlameScope 更高级全面的火焰图 文章目录 FlameScope 更高级全面的火焰图 安装步骤 安装问题fix 使用方式 网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务 ...
- 在OR项目中使用火焰图
火焰图介绍 看到openresty里用火焰图觉得挺有意思的,又装逼又有用.它可以快速的定位到程序性能的瓶颈,生成程序的调用栈并且计算调用栈中每部分的 CPU 消耗,能够比较容易的找到CPU占用高.内存 ...
- java实例_图例 | Java混合模式分析之火焰图实例
这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...
- 图例 | Java混合模式分析之火焰图实例
这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...
- 使用火焰图(FlameGraph)分析程序性能
火焰图概念 火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来.表现形 ...
- C++ 之 perf+火焰图分析与Debug
0. 简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,之前作者就专门写过两篇博客(Ubuntu环境下便于调试代码的工具.Valgrind对ROS程序的可视化分析)来介绍性能分析的问 ...
- 火焰图(Flame Graphs)的安装和基本用法
火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...
最新文章
- SpringMVC基于框架编写CommDao类---findList
- 80%的企业社会化商务应用可能无法取得预期效果
- Kogito,ergo规则:从知识到服务,轻松自如
- Google Guava BiMaps
- C语言六叉树,递归创建二叉树c语言实现+详细解释
- SSH远程登录VWware上的LFS
- 201521123032 《Java程序设计》第8周学习总结
- intellij idea如何打包
- UART 初始化及使用示例代码
- 除了富二代 据说这9种人最有富豪潜质
- hdu 4334 Trouble 排序+优化 多校联合赛(四)第四题
- 计算机数据处理规模大小分为,计算机组成原理题集样稿.doc
- 配置案例| Modbus转Profinet网关与ARX-MA100微型空气质量监测系统连接
- Ceph文件系统与原生磁盘读写性能的比较
- flutter type ‘Null‘ is not a subtype of type ‘String‘
- provisional headers are shown问题解决
- 网口压线顺序_网线水晶头接法口诀顺序及接法详细步骤
- IGBT的驱动功率计算
- deepin php7,deepin安装php7
- 深入理解先验分布、后验分布、似然估计