arthas火焰图性能分析

7,577 阅读2分钟

arthas火焰图

1.使用

使用逻辑为,采样开始--执行被测试动作--采样结束--分析

可以进入arthas内部使用,也可以直接调用脚本(-d 指定采样时间,-e 指定采样内容为内存占用,3456为PID号)

profiler.sh -d 30 -e alloc -f profile.svg 3456

采样方法

  • 启动,默认采样信息为CPU可以通过--event进行指定

支持的分析动作包括CPU,内存,锁等cpu, alloc, lock, cache-misses

$ profiler start
Started [cpu] profiling
  • 查看状态
$ profiler status
[cpu] profiling is running for 4 seconds
  • 结束采样,会看到文件存放位置
profiler stop
  • 简化命令
profiler start --duration 30 --file profile.svg --event alloc --d 306954

2.分析

分析思路总结只有一句话:火焰图里,横条越长,代表使用的越多,从下到上是调用堆栈信息

越宽表示被调用越多执行时间长,越高表示调用栈越深

火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

支持操作

点击

在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息,左上角可以reset

悬浮

火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子

搜索

按下 Ctrl + F 会显示一个搜索框,直接搜索函数,支持正则

实例

image.png

上面图片中,最顶层的函数g()占用 CPU 时间最多。d()的宽度最大,但是它直接耗用 CPU 的部分很少。b()c()没有直接消耗 CPU。因此,如果要调查性能问题,首先应该调查g(),其次是i()

另外,从图中可知a()有两个分支b()h(),这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()

3.常用命令

# 内存分配
./profiler.sh -d 10 -e alloc -f output-alloc.svg -t 1786 
# cpu
./profiler.sh -d 10 -e cpu -f output-cpu.svg  --all-user 1786

# trace 方法
./profiler.sh -d 10 -e hotMethod1 -f output-method.svg  --all-user 1786

# cpu
./profiler.sh -d 10 -f output-cpu.svg  --all-user 1786

#时钟信号
./profiler.sh -d 10 -e wall -f output-wall.svg  -t 1786

# 支持的命令
./profiler.sh list  1786

#帮助文档
./profiler.sh