...
选择目标进程,输入对应的序号并输入回车即可进入对该进程的监控。
需要注意的是,arthas与目标进程须具备相同的用户权限,否则在运行过程中可能会attach失败。
Dashboard
进入监控后,输入dashboard命令,即可看到整个进程的概况。输入Q或Ctrl+c可退出预览。
在显示的面板中,可以看到如下的信息:
进程内的线程概况:线程运行时间,线程运行状态等
进程的内存使用概况:例如堆内和堆外内存使用情况,新生代、老年代等对象占用情况进程的内存使用概况:例如堆内和堆外内存使用情况,新生代、老年代等堆空间占用情况
运行环境信息:操作系统版本、JDK版本等
Profiler
...
Code Block | ||
---|---|---|
| ||
#开始抽样,-e可用于指定抽样的event,可以是cpu或alloc profiler start -e cpu; #查看抽样任务执行的时间 profiler status; #查看抽样任务的抽样数量 profiler getSamples; #结束抽样,并将结果的火焰图输出为html格式,--file可指定输出的文件 profiler stop --format html --file /mnt/d/arthas/cpu.html; |
抽样任务输出火焰图后,就要基于火焰图进行分析。
...
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图里,横条越长,代表使用的越多,从下到上是调用堆栈信息。
分析思路总结只有一句话:火焰图里,横条越长,代表使用的越多,从下到上是调用堆栈信息。
越宽表示被调用越多执行时间长,越高表示调用栈越深。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
...
Code Block |
---|
profiler start -e cpu; profiler stop --format html --file /mnt/d/arthas/cpu.html; |
下图展示了一次简单的客户端单线程写入,IoTDB运行过程中某一段时间的CPU抽样片段。
在CPU抽样的火焰图中,横条表示函数,其长度表示执行时间,越宽表示被调用越多执行时间长,越高表示调用栈越深。
profiler生成的火焰图html文件支持点击放大操作,下图仅展示了整体的概况;如需查看具体的函数调用栈,可点击对应的横条。
内存抽样
进行内存分析时,堆分析器需要HotSpot调试符号,Oracle JDK已经将它们嵌入到libjvm.so中,但是OpenJDK在构建时,被打包到了单独的包中。
...
Code Block |
---|
apt install openjdk-8-dbg; |
启动一次CPU抽样任务,执行一段时间后即可关闭,并输出结果火焰图。
Code Block |
---|
profiler start -e alloc; profiler stop --format html --file /mnt/d/arthas/alloc.html; |
下图展示了一次简单的客户端单线程写入,IoTDB运行过程中某一段时间的内存抽样片段。
在内存抽样的火焰图中,横条表示函数,其宽度表示执行时分配的空间,越宽表示分配的空间越多,越高表示调用栈越深。
参考
...