Arthas 初探--安裝初步適用

做者 | agmtopy java

【Arthas 官方社區正在舉行徵文活動,參加即有獎品拿~點擊投稿linux

因爲在項目中遇到一種狀況,某段代碼在進行單元測試和在 tomcat 容器中運行的性能相差數百倍,所以須要分析在不一樣環境下某個方法執行的具體時間,從而肯定問題。Arthas 能夠作到無侵入的監控應用遠行狀況。git

安裝

安裝:github

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

linux 下直接執行,window 下載文件後執行。tomcat

1.png

執行完成後,顯示當前 path 中指定的 JDK 中正在運行的 java 進程輸入相應序號,進入 sh 命令,表示已鏈接成功。session

2.png

初步使用

Arthas 命令初步使用,大概分爲 5 類:less

基礎命令

  • help——查看命令幫助信息
  • cat——打印文件內容,和 linux 裏的 cat 命令相似
  • pwd——返回當前的工做目錄,和 linux 命令相似
  • cls——清空當前屏幕區域
  • session——查看當前會話的信息
  • reset——重置加強類,將被 Arthas 加強過的類所有還原,Arthas 服務端關閉時會重置全部加強過的類
  • version——輸出當前目標 Java 進程所加載的 Arthas 版本號
  • history——打印命令歷史
  • quit——退出當前 Arthas 客戶端,其餘 Arthas 客戶端不受影響
  • shutdown——關閉 Arthas 服務端,全部 Arthas 客戶端所有退出
  • keymap——Arthas快捷鍵列表及自定義快捷鍵

jvm相關

  • dashboard——當前系統的實時數據面板
  • thread——查看當前 JVM 的線程堆棧信息
  • jvm——查看當前 JVM 的信息
  • sysprop——查看和修改 JVM 的系統屬性
  • sysenv——查看 JVM 的環境變量
  • getstatic——查看類的靜態屬性
  • New! ognl——執行 ognl 表達式
  • New! mbean——查看 Mbean 的信息

class/classloader相關

  • sc——查看 JVM 已加載的類信息
  • sm——查看已加載類的方法信息
  • jad——反編譯指定已加載類的源碼
  • mc——內存編繹器,內存編繹 .java 文件爲 .class 文件
  • redefine——加載外部的 .class 文件,redefine 到 JVM 裏
  • dump——dump 已加載類的 byte code 到特定目錄
  • classloader——查看 classloader 的繼承樹,urls,類加載信息,使用 classloader 去 getResource

monitor/watch/trace 相關

請注意,這些命令,都經過字節碼加強技術來實現的,會在指定類的方法中插入一些切面來實現數據統計和觀測,所以在線上、預發使用時,請儘可能明確須要觀測的類、方法以及條件,診斷結束要執行 shutdown 或將加強過的類執行 reset 命令。jvm

  • monitor——方法執行監控
  • watch——方法執行數據觀測
  • trace——方法內部調用路徑,並輸出方法路徑上的每一個節點上耗時
  • stack——輸出當前方法被調用的調用路徑
  • tt——方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不一樣的時間下調用進行觀測

options

  • options——查看或設置 Arthas 全局開關

使用實列

  • trace 分析每一個方法的具體執行時間

3.png

經過圖示代表調用 MongoTemplate.executeFindMultiInternal() 方法時,最耗時的方法是在 doWith() 方法,總共執行 10000 次,耗時 ==252.3064ms==,最少一次調用耗時 ==0.0132ms==,最大一次耗時 ==38.4329ms==,分析緣由仍是在於數據量太大,MongoTemplate 經過循環遍歷出結果在進行序列化。ide

  • jad 反編譯代碼工具
jad com.sankuai.inf.leaf.common.ZeroIDGen

4.png

  • watch 查看輸入參數與輸出參數
watch com.sankuai.inf.leaf.server.service.SegmentService getId '{params, target, returnObj}' -x 2

params 表示入參,target 表示當前的類,returnObj 表示返回值。微服務

5.png

  • stack 查看被調用的路徑(向上)
stack com.sankuai.inf.leaf.server.service.SegmentService getId

6.png

  • sc 查看 JVM 已加載的類信息
sc -d com.sankuai.inf.leaf.server.service.SegmentService getId

7.png

  • thread 分析死鎖
thread b

8.png
9.png

能夠看出當前線程正在等待 ReentrantLock$NonfairSync@118f1fb4,而持有這個對象的線程又在等待當前線程釋放,從而造成死鎖!

  • thread 分析 CPU 佔用

10.png

總結

先放一張官方的總結大圖:

11.png

總結:Arthas 是一個很優秀的 java 診斷工具,不管是安裝仍是使用都很簡潔,而且使用文檔全面、清晰明瞭,值得好好研究一番。

Arthas 徵文活動火熱進行中

Arthas 官方正在舉行徵文活動,若是你有:

  • 使用 Arthas 排查過的問題
  • 對 Arthas 進行源碼解讀
  • 對 Arthas 提出建議
  • 不限,其它與 Arthas 有關的內容

    歡迎參加徵文活動,還有獎品拿哦~點擊投稿

阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的公衆號。」

相關文章
相關標籤/搜索