【分析工具】阿里巴巴Arthas--線上問題分析利器



本博客轉載自阿里開源的 Java 診斷工具


1. Arthas是什么

Arthas是一款阿里巴巴開源的 Java 線上診斷工具,功能非常強大,可以解決很多線上不方便解決的問題。

Arthas診斷使用的是命令行交互模式,支持JDK6+,Linux、Mac、Windows 操作系統,命令還支持使用 tab 鍵對各種信息的自動補全,診斷起來非常方便。

這是它的官方網站:

https://alibaba.github.io/arthas/index.html

Github地址:

https://github.com/alibaba/arthas

2. Arthas能解決什么問題

看下Arthas的官方說明

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
1、這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
2、我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
3、遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
4、線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
5、是否有一個全局視角來查看系統的運行狀況?
6、有什么辦法可以監控到JVM的實時運行狀態?

看完是不是覺得太牛逼了?特別是它可以在線反編譯類,可以不用加日志在線調試跟蹤問題代碼。

3. 快速安裝

官方推薦使用 arthas-boot 進行安裝,非常方便,以下是基於 Linux 系統環境進行演示,一般解決線上問題也是基於 Linux 環境。

第一步:下載

在任何目錄下載 arthas-boot 這個包。

wget https://alibaba.github.io/arthas/arthas-boot.jar

[root@VM_0_7_centos ~]# wget https://alibaba.github.io/arthas/arthas-boot.jar
--2019-07-30 14:48:31--  https://alibaba.github.io/arthas/arthas-boot.jar
Resolving alibaba.github.io (alibaba.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...
Connecting to alibaba.github.io (alibaba.github.io)|185.199.108.153|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 98637 (96K) [application/java-archive]
Saving to: ‘arthas-boot.jar’

100%[==========================================================================================================>] 98,637      32.8KB/s   in 2.9s   

2019-07-30 14:48:36 (32.8 KB/s) - ‘arthas-boot.jar’ saved [98637/98637]

第二步:運行

使用 java -jar 命令執行 arthas-boot 包。(如果運行失敗,建議進行全量安裝arthas,參考文檔中的全量安裝章節)

java -jar arthas-boot.jar

[INFO] arthas-boot version: 3.1.1
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 13062 spring-boot-best-practice-0.0.1-SNAPSHOT.jar

第三步:選擇進程

運行 arthas-boot 后,控制台會顯示所有 Java 進程,選擇一個你需要診斷的進程。

如第二步所示,這里有只有一個 Java 進程,輸入序號1,回車,Arthas會附到目標進程上,並輸出日志:

[INFO] Start download arthas from remote server: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.1.1/arthas-packaging-3.1.1-bin.zip
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/3.1.1/arthas
[INFO] Try to attach process 13062
[INFO] Attach process 13062 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
 /  O   |  .--. ''--.  .--'|  '--'  | /  O   '   .-'                          
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
|  | |  ||  |      |  |   |  |  |  ||  | |  |.-'    |                         
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          


wiki      https://alibaba.github.io/arthas                                      
tutorials https://alibaba.github.io/arthas/arthas-tutorials                     
version   3.1.1                                                                 
pid       13062                                                                 
time      2019-07-30 14:49:34

至此,安裝、啟動完成。

更多其他安裝方式見:https://alibaba.github.io/arthas/install-detail.html

4. 實戰使用

啟動完成后,當前光標會進入 arthas 的控制台,接受各種操作命令。

下面,棧長會做幾個常用命令的演示,讓大家對它有一個基本的認識和快速上手的能力。

1、dashboard
顯示當前系統的實時數據面板,按 ctrl+c 即可退出。

$ dashboard

dashboard

2. thread
查看當前 JVM 的線程堆棧信息。

thread id, 顯示指定線程的運行堆棧:

$ thread 20

顯示當前最忙的前N個線程並打印堆棧:

$ thread -n 3

3. sc
查看 JVM 已加載的類詳細信息。

$ sc -d *Test

4. sm
查看已加載類的方法信息。

$ sm -d cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication main

5. jad
反編譯指定已加載類的源代碼。

$ jad cn.javastack.springbootbestpractice.SpringBootBestPracticeApplication

6. trace
顯示方法內部調用路徑,非實時返回的命令並輸出方法路徑上的總耗時,以及的每個節點上的詳細耗時。

$ trace -j cn.javastack.springbootbestpractice.web.JsonTest getUserInfo

7. monitor
對某個方法的調用進行定時監控。

$ monitor cn.javastack.springbootbestpractice.web.JsonTest getUserInfo -c 5

-c 5:表示每5秒統計一次,統計周期,默認值為120秒。

監控維度說明:

8. watch
觀測方法執行數據,能方便的觀察到指定方法的調用情況,如:返回值、拋出異常、入參等。

$ watch cn.javastack.springbootbestpractice.web.JsonTest getUserInfo '{params, returnObj}' -x 2 -b

以上監控的是一個方法的入參情況,在方法執行前監控:-b,遍歷深度:-x 2。

9. quit/exit
退出當前 Arthas。

這個命令僅退出當前連接的客戶端,附到目標進程上的 Arthas 會繼續運行,端口不會關閉,下次連接時可以直接連接使用。

10. shutdown
關閉 Arthas 服務端,退出所有 Arthas 客戶端。

以上演示了 10 個命令的基本使用,各種命令的使用詳情可以在命令帶 --help 進行查閱。

更多其他命令請參考:

https://alibaba.github.io/arthas/commands.html

5. 總結

總結下來,使用 Arthas 可以很方便的診斷一個 Java 應用程序,如:系統數據面板、JVM實時運行狀態、類加載情況、監控方法執行情況、顯示方法執行路徑等。

Arthas這些實用的功能確實可以幫助我們解決一些常見的線上問題,也能獨立於應用程序代碼,但僅局限於在一個 JVM 進程內,如果是分布式系統,Arthas就有點難了。


免責聲明!

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



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