文章目录
- Arthas火焰图分析应用性能
- 简介
- 进入Linux容器内
- 下载arthas包
- 开始录制
- 查看所有支持的 action
- 查看版本
- 启动 profiler
- profiler 支持的 events
- 获取已采集的 sample 的数量
- 查看 profiler 状态
- 停止 profiler
- 生成 html 格式结果
- 执行结果
- 恢复采样
- 颜色意义
- 图中x-y轴代表
- 栈宽含义(CPU时间)
- 平顶现象(一定要格外注意)
- 总结
Arthas火焰图分析应用性能
简介
1、什么是火焰图
火焰图(Flame Graph)是一种用于可视化性能分析的图表,最初由Brendan Gregg开发。它主要用于分析CPU使用情况和函数调用堆栈。火焰图以图形的形式展示了函数调用的层次结构和时间分布,可以帮助开发人员快速定位应用程序中的性能瓶颈和热点。
在火焰图中,每个矩形代表一个函数,矩形的宽度表示该函数在采样中出现的频率或占用的CPU时间,矩形的高度表示函数的调用深度。火焰图的顶部是应用程序的入口函数,底部是最深层次的函数。通过观察火焰图的形状和颜色,开发人员可以迅速识别出CPU密集型函数和热点函数,从而进行性能优化和调试。
火焰图通常与性能分析工具(如perf、Java Flight Recorder等)结合使用,这些工具可以捕获应用程序的调用堆栈和CPU使用情况数据,并生成相应的火焰图。火焰图已经成为性能分析领域中常用的工具,为开发人员提供了一种直观而有效的方式来理解和优化应用程序的性能。
2、火焰图有什么作用
火焰图在性能分析中有许多重要的作用,包括:
可视化性能瓶颈:火焰图可以直观地展示函数调用的层次结构和时间分布,帮助开发人员迅速定位应用程序中的性能瓶颈和热点。通过观察火焰图的形状和颜色,可以快速识别出CPU密集型函数和耗时函数。
优化性能:通过分析火焰图,开发人员可以了解哪些函数占用了大量的CPU时间,从而有针对性地进行性能优化。可以重点关注那些占用较多时间的函数,优化算法、减少不必要的计算或者进行并发优化等。
排查问题:火焰图可以帮助开发人员快速定位应用程序中的问题。通过观察火焰图中异常或者异常的函数调用,可以追踪问题的根源,找出导致性能下降或者错误的原因。
监控和调试:火焰图可以与实时性能监控工具结合使用,帮助开发人员实时监控应用程序的性能情况。可以通过不断更新的火焰图,了解应用程序在不同时间段的性能表现,并及时发现和解决问题。
总之,火焰图是一种强大的工具,可以帮助开发人员深入了解应用程序的性能特征,定位问题和优化性能。它提供了一个直观而有效的方式来分析和改进应用程序的性能。
进入Linux容器内
自行进入
下载arthas包
curl -O https://arthas.aliyun.com/math-game.jar
java -jar math-game.jar
我用的训练场先试了一遍了解再去linux里弄的
开始录制
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
执行结果
打开输出的网页,可以随意缩放查看某个点
恢复采样
$ profiler resume
Started [cpu] profiling
start
和resume
的区别是:start
是新开始采样,resume
会保留上次stop
时的数据。
通过执行profiler getSamples
可以查看 samples 的数量来验证。
颜色意义
- 绿色:Java代码
- 黄色:JVM,C++代码
- 红色:用户态,C代码
- 橙色:内核态,C代码
图中x-y轴代表
- x轴代表函数在采样中出现的频率或占用的CPU时间
- y轴代表方法的调用栈深度
栈宽含义(CPU时间)
宽度可以理解为CPU采样率的占比,越宽代表当前栈在采样数中占比高,其可能为三种含义
该函数运行时间长
该函数被调用次数多
平顶现象(一定要格外注意)
平顶现象是由于当前程序的采样数在总采样数中占用过高导致的,出现这种现象需要特意关注一下程序具体的调用栈,采样比例占用率过高,即代表方法在CPU中的占用率过高
总结
火焰图只是用于辅助程序分析定位问题,查看程序在采样期间的大致情况,实际场景还需结合CPU占用率、查看JVM的DUMP快照等方式进行定位