Arthas 使用以及火焰图

发布于:2022-10-21 ⋅ 阅读:(560) ⋅ 点赞:(0)
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

Arthas(阿尔萨斯)能为你做什么?

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从 JVM 内查找某个类的实例?

快速入门

Arthas 下载地址

1、 启动 待监控jar服务

2、启动 arthas

在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
  • 执行该程序的用户需要和目标进程具有相同的权限。比如以admin 用户来执行:sudo su admin && java -jar arthas-boot.jar  或 sudo -u admin -EH java -jar arthas-boot.jar
  • 如果 attach 不上目标进程,可以查看~/logs/arthas/  目录下的日志。
  • 如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
  • java -jar arthas-boot.jar -h  打印更多参数信息。
选择应用 java 进程: Arthas 会 attach 到目标进程上,并输出日志:

3、查看 dashboard

输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

4、 退出 arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。
如果想完全退出 arthas,可以执行stop命令。

5. 用 as.sh 启动

解压后,在文件夹里有as.sh,直接用./as.sh的方式启动: 或者通过select参数可以指定进程名字
./as.sh
./as.sh --select datachecker-check-0.0.1

打印帮助信息:

./as.sh -h
用 arthas-boot 启动
或者在解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动:
java -jar arthas-boot.jar

6、Arthas 火焰图

        profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
        profiler 命令基本运行结构是 profiler action [actionArg]
        参数说明
参数名称    
参数说明
action  要执行的操作
actionArg    属性名模式

[i:]    采样间隔(单位:ns)(默认值:10’000’000,即10 ms)

[f:]    将输出转储到指定路径

[d:]    运行评测指定秒

[e:]    要跟踪哪个事件(cpu, alloc, lock, cache-misses等),默认是 cpu

采样

(1)启动 profiler
[arthas@44]$ profiler start
Started [cpu] profiling

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

(2)获取已采集的 sample 的数量
[arthas@44]$ profiler getSamples
(3)查看 profiler 状态
可以查看当前 profiler 在采样哪种 event 和采样时间。
[arthas@44]$ profiler status
[cpu] profiling is running for 51 seconds
(4)停止 profiler
  默认情况下,生成的格式为 svg 格式,且生成的结果保存到应用的 工作目录 下的 arthas-output 目录。
Started [cpu] profiling
[arthas@44]$ profiler stop
OK
profiler output file: /mnt/c/Users/Jitwxs/Downloads/arthas-output/20201227-214951.svg
  可以通过 --file 参数来指定输出结果路径。比如:
[arthas@44]$  profiler stop --file ./output.svg
OK
profiler output file: ./output.svg
  如果需要生成 html 格式的,可以用 --format 参数指定:
[arthas@44]$  profiler stop --format html

渲染

默认情况下,arthas使用3658端口,则可以打开: http://localhost:3658/arthas-output/ 查看到arthas-output目录下面的 profiler 结果,或者直接打开源文件即可。

event 支持

在不同的平台,不同的OS下面,支持的events各有不同。可以通过 profiler list 命令查询。

恢复采样

[arthas@44]$ profiler resume
start和resume的区别是:start是新开始采样,resume会保留上次stop时的数据。
通过执行profiler getSamples可以查看 samples 的数量来验证。

framebuf 参数

如果遇到生成的svg图片有 [frame_buffer_overflow],则需要增大 framebuf(默认值是 1’000’000),可以显式配置,比如:
[arthas@44]$ profiler start --framebuf 5000000

过滤数据

如果应用比较复杂,生成的内容很多,想只关注部分数据,可以通过 include/exclude 来过滤。比如:
[arthas@44]$ profiler start --include 'java/*' --include 'demo/*' --exclude '*Unsafe.park*'
include/exclude 都支持设置多个值 ,但是需要配置在命令行的最后。

指定执行时间

比如,希望 profiler 执行 300 秒自动结束,可以用 -d/--duration 参数指定:
[arthas@44]$ profiler start --duration 300

7、火焰图分析

  • 火焰图是基于 perf 结果产生的SVG 图片,用来展示 CPU 的调用栈。
  • y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
  • x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
  • 火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
  • 颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
本文含有隐藏内容,请 开通VIP 后查看