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.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM