转自文章: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 文件了。

【转载】火焰图安装使用相关推荐

  1. openresty火焰图安装

    1.下载systemtap安装包并安装 从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 我安装的时候, ...

  2. Flame Graphs 火焰图安装与使用

    一.火焰图概述  火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 ...

  3. FlameScope 更高级全面的火焰图

    FlameScope 更高级全面的火焰图 文章目录 FlameScope 更高级全面的火焰图 安装步骤 安装问题fix 使用方式 网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务 ...

  4. 在OR项目中使用火焰图

    火焰图介绍 看到openresty里用火焰图觉得挺有意思的,又装逼又有用.它可以快速的定位到程序性能的瓶颈,生成程序的调用栈并且计算调用栈中每部分的 CPU 消耗,能够比较容易的找到CPU占用高.内存 ...

  5. java实例_图例 | Java混合模式分析之火焰图实例

    这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...

  6. 图例 | Java混合模式分析之火焰图实例

    这是小小的第五篇 前言 在进行性能调优的时候,通常会借助性能分析工具,常用的性能分析工具有perf,DTrace,分析系统资源的使用情况,这些情况根据CPU,内存,生成相关的文本数据,这些文本数据不容 ...

  7. 使用火焰图(FlameGraph)分析程序性能

    火焰图概念 火焰图(FlameGraph)是 svg 格式的矢量图,是先通过 perf 等工具分析得到结果,并将该结果生成的具有不同层次且支持互动的图片,看起来就像是火焰,这也是它的名字的由来.表现形 ...

  8. C++ 之 perf+火焰图分析与Debug

    0. 简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,之前作者就专门写过两篇博客(Ubuntu环境下便于调试代码的工具.Valgrind对ROS程序的可视化分析)来介绍性能分析的问 ...

  9. 火焰图(Flame Graphs)的安装和基本用法

    火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...

最新文章

  1. SpringMVC基于框架编写CommDao类---findList
  2. 80%的企业社会化商务应用可能无法取得预期效果
  3. Kogito,ergo规则:从知识到服务,轻松自如
  4. Google Guava BiMaps
  5. C语言六叉树,递归创建二叉树c语言实现+详细解释
  6. SSH远程登录VWware上的LFS
  7. 201521123032 《Java程序设计》第8周学习总结
  8. intellij idea如何打包
  9. UART 初始化及使用示例代码
  10. 除了富二代 据说这9种人最有富豪潜质
  11. hdu 4334 Trouble 排序+优化 多校联合赛(四)第四题
  12. 计算机数据处理规模大小分为,计算机组成原理题集样稿.doc
  13. 配置案例| Modbus转Profinet网关与ARX-MA100微型空气质量监测系统连接
  14. Ceph文件系统与原生磁盘读写性能的比较
  15. flutter type ‘Null‘ is not a subtype of type ‘String‘
  16. provisional headers are shown问题解决
  17. 网口压线顺序_网线水晶头接法口诀顺序及接法详细步骤
  18. IGBT的驱动功率计算
  19. deepin php7,deepin安装php7
  20. 深入理解先验分布、后验分布、似然估计

热门文章

  1. MATLAB排序滤波
  2. Photoshop CC 2018 安装教程
  3. 携手经典阅读 提高个人素养
  4. 张赐荣: 详解 Java 中的包装类型
  5. 助力“黑科技” 阿里云发布人工智能服务DTPAI
  6. 点击按钮,在input框在光标位置插入文字,系列问题待解决
  7. a16z:如何建设基于声誉的去中心化身份系统? |链捕手
  8. dpdk Vhost 库
  9. 【presto】使用python执行presto任务
  10. 小班语言游戏教案%3c我的五官%3e,小班语言活动——我的五官教案