文章目录

  • Arthas火焰图分析应用性能
  • 简介
  • 进入Linux容器内
  • 下载arthas包
  • 开始录制
  • 查看所有支持的 action
  • 查看版本
  • 启动 profiler
  • profiler 支持的 events
  • 获取已采集的 sample 的数量
  • 查看 profiler 状态
  • 停止 profiler
  • 生成 html 格式结果
  • 执行结果
  • 恢复采样
  • 颜色意义
  • 图中x-y轴代表
  • 栈宽含义(CPU时间)
  • 平顶现象(一定要格外注意)
  • 总结


Arthas火焰图分析应用性能

简介

Github:async-profile

arthas文档-profiler片段

在线学习训练场

Arthas火焰图分析应用性能_火焰图


1、什么是火焰图

火焰图(Flame Graph)是一种用于可视化性能分析的图表,最初由Brendan Gregg开发。它主要用于分析CPU使用情况和函数调用堆栈。火焰图以图形的形式展示了函数调用的层次结构和时间分布,可以帮助开发人员快速定位应用程序中的性能瓶颈和热点。

在火焰图中,每个矩形代表一个函数,矩形的宽度表示该函数在采样中出现的频率或占用的CPU时间,矩形的高度表示函数的调用深度。火焰图的顶部是应用程序的入口函数,底部是最深层次的函数。通过观察火焰图的形状和颜色,开发人员可以迅速识别出CPU密集型函数和热点函数,从而进行性能优化和调试。

火焰图通常与性能分析工具(如perf、Java Flight Recorder等)结合使用,这些工具可以捕获应用程序的调用堆栈和CPU使用情况数据,并生成相应的火焰图。火焰图已经成为性能分析领域中常用的工具,为开发人员提供了一种直观而有效的方式来理解和优化应用程序的性能。

2、火焰图有什么作用
火焰图在性能分析中有许多重要的作用,包括:

可视化性能瓶颈:火焰图可以直观地展示函数调用的层次结构和时间分布,帮助开发人员迅速定位应用程序中的性能瓶颈和热点。通过观察火焰图的形状和颜色,可以快速识别出CPU密集型函数和耗时函数。

优化性能:通过分析火焰图,开发人员可以了解哪些函数占用了大量的CPU时间,从而有针对性地进行性能优化。可以重点关注那些占用较多时间的函数,优化算法、减少不必要的计算或者进行并发优化等。

排查问题:火焰图可以帮助开发人员快速定位应用程序中的问题。通过观察火焰图中异常或者异常的函数调用,可以追踪问题的根源,找出导致性能下降或者错误的原因。

监控和调试:火焰图可以与实时性能监控工具结合使用,帮助开发人员实时监控应用程序的性能情况。可以通过不断更新的火焰图,了解应用程序在不同时间段的性能表现,并及时发现和解决问题。

总之,火焰图是一种强大的工具,可以帮助开发人员深入了解应用程序的性能特征,定位问题和优化性能。它提供了一个直观而有效的方式来分析和改进应用程序的性能。

进入Linux容器内

自行进入

下载arthas包

arthas快速开始

curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar

Arthas火焰图分析应用性能_火焰图_02

我用的训练场先试了一遍了解再去linux里弄的

Arthas火焰图分析应用性能_应用程序_03

开始录制

profiler 命令 支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。

profiler` 命令基本运行结构是 `profiler action [actionArg]

查看所有支持的 action

profiler actions

查看版本

profiler version

启动 profiler

profiler start --event cpu

默认情况下,生成的是 cpu 的火焰图,即 event 为cpu 。可以用--event 参数来指定。

profiler 支持的 events

在不同的平台,不同的 OS 下面,支持的 events 各有不同。比如在 macos 下面:

$ profiler list
Basic events:
  cpu
  alloc
  lock
  wall
  itimer

在 linux 下面

$ profiler list
Basic events:
  cpu
  alloc
  lock
  wall
  itimer
Perf events:
  page-faults
  context-switches
  cycles
  instructions
  cache-references
  cache-misses
  branches
  branch-misses
  bus-cycles
  L1-dcache-load-misses
  LLC-load-misses
  dTLB-load-misses
  mem:breakpoint
  trace:tracepoint

如果遇到 OS 本身的权限/配置问题,然后 缺少部分 event,可以参考async-profiler本身文档:async-profiler在新窗口打开

可以用--event参数指定要采样的事件,比如对alloc事件进入采样:

$ profiler start --event alloc

获取已采集的 sample 的数量

profiler getSamples

查看 profiler 状态

profiler status

停止 profiler

生成 html 格式结果

默认情况下,结果文件是html 格式。也可以用--format 参数指定:

profiler stop --format html

或者在--file 参数里用文件名指名格式。比如--file /root/arthas-output/result.html

profiler stop --file /root/arthas-output/result.html

执行结果

Arthas火焰图分析应用性能_java_04

打开输出的网页,可以随意缩放查看某个点

Arthas火焰图分析应用性能_开发人员_05

恢复采样

$ profiler resume
Started [cpu] profiling

startresume的区别是:start是新开始采样,resume会保留上次stop时的数据。

通过执行profiler getSamples可以查看 samples 的数量来验证。

颜色意义

  • 绿色:Java代码
  • 黄色:JVM,C++代码
  • 红色:用户态,C代码
  • 橙色:内核态,C代码

图中x-y轴代表

  • x轴代表函数在采样中出现的频率或占用的CPU时间
  • y轴代表方法的调用栈深度

栈宽含义(CPU时间)

宽度可以理解为CPU采样率的占比,越宽代表当前栈在采样数中占比高,其可能为三种含义
该函数运行时间长
该函数被调用次数多

平顶现象(一定要格外注意)

平顶现象是由于当前程序的采样数在总采样数中占用过高导致的,出现这种现象需要特意关注一下程序具体的调用栈,采样比例占用率过高,即代表方法在CPU中的占用率过高

总结

火焰图只是用于辅助程序分析定位问题,查看程序在采样期间的大致情况,实际场景还需结合CPU占用率、查看JVM的DUMP快照等方式进行定位