Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)能为你做什么?
-
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
-
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
-
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
-
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
-
是否有一个全局视角来查看系统的运行状况?
-
有什么办法可以监控到 JVM 的实时运行状态?
-
怎么快速定位应用的热点,生成火焰图?
-
怎样直接从 JVM 内查找某个类的实例?
快速入门
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 后查看