Arthas线上调优工具实战

Arthas

  1. 它是什么?

    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

  2. 它能解决什么问题?

    1. 我想看一下jvm当前的运行状态,怎么看?

    2. 系统CPU跑到300%,怎么定位问题?

    3. 接口频繁超时,如何精准定位问题?

    4. 如何查看当前正在执行的源码?

    5. 小程序对接,看不到接口的返回值,怎么办?

    6. 线上发现代码出bug了,但是这时候无法紧急发版,怎么办?

    7. 如何在不发版的情况下更新日志级别?

      ..........

  3. 如何使用?

     

快速安装

使用arthas-boot(推荐)

下载arthas-boot.jar,然后用java -jar的方式启动:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

打印帮助信息:

java -jar arthas-boot.jar -h

 

image-20210322225533913

卸载

  • 在 Linux/Unix/Mac 平台

    删除下面文件:

    rm -rf ~/.arthas/
    rm -rf ~/logs/arthas
  • Windows平台直接删除user home下面的.arthaslogs/arthas目录

dashboard

查看当前系统的实时数据面板,按ctrl+c退出

参数说明

参数名称参数说明
[i:] 刷新实时数据的时间间隔 (ms),默认5000ms
[n:] 刷新实时数据的次数

截图展示

dashboard

数据说明:

  1. thread:

    • ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应。

    • NAME: 线程名

    • GROUP: 线程组名

    • PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高

    • STATE: 线程的状态

    • CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10%

    • DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为

    • TIME: 线程运行总CPU时间,数据格式为分:秒

    • INTERRUPTED: 线程当前的中断位状态

    • DAEMON: 是否是daemon线程

  2. memory:

    1. heap

      1. ps_eden_space:伊甸园

      2. ps_survivor_space:幸存者区

      3. ps_old_gen:老年代

    2. nonheap

      1. code_cache:代码缓存区

      2. metaspace:元空间

      3. compressed_class_space:压缩类空间

      4. direct: Direct Memory,nio使用的堆外空间

      5. mapped:内存映射文件,nio使用

  3. GC:

    1. gc.ps_scavenge.count:垃圾回收次数

    2. gc.ps_scavenge.time(ms):垃圾回收消耗时间

    3. gc.ps_marksweep.count:标记-清除算法的次数

    4. gc.ps_marksweep.time(ms):标记-清除算法的消耗时间

  4. Runtime: 当前系统参数

thread

查看当前线程信息,查看线程的堆栈

参数说明

参数名称参数说明
id 线程id
[n:] 指定最忙的前N个线程并打印堆栈
[b] 找出当前阻塞其他线程的线程
[i <value>] 指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200
[--all] 显示所有匹配的线程

trace(线上环境高并发接口慎用)

方法内部调用路径,并输出方法路径上的每个节点上耗时

使用方式: trace 全类名 方法名

jad

反编译指定已加载类的源码

使用方式: jad 全类名

watch(线上环境高并发接口慎用)

方法执行数据观测

使用方式: watch 全类名 方法名

redefine(线上环境禁用)

热更新线上代码

  1. 通过sc查找需要修改的class的ClassLoader

    sc -d 全类名 | grep classLoaderHash

  2. 再使用redefine命令重新加载新编译好的class文件

    redefine -c classLoaderHash class文件地址

logger

修改线上日志级别

  1. 通过sc命令查看JVM已加载的类信息,拿到classLoaderHash

    sc -d 全类名 | grep classLoaderHash

  2. 更新指定类日志级别

    logger -c classLoaderHash --name 全类名 --level 日志等级

  3.  

posted @ 2021-06-27 10:39  海冠军  阅读(1924)  评论(0编辑  收藏  举报