天天看點

Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

作者 | agmtopy

【Arthas 官方社群正在舉行征文活動,參加即有獎品拿~

點選投稿

由于在項目中遇到一種情況,某段代碼在進行單元測試和在 tomcat 容器中運作的性能相差數百倍,是以需要分析在不同環境下某個方法執行的具體時間,進而确定問題。Arthas 可以做到無侵入的監控應用遠行情況。

安裝

安裝:

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

linux 下直接執行,window 下載下傳檔案後執行。

Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

執行完成後,顯示目前 path 中指定的 JDK 中正在運作的 java 程序輸入相應序号,進入 sh 指令,表示已連接配接成功。

Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

初步使用

Arthas 指令初步使用,大概分為 5 類:

基礎指令

  • 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 指令。

  • monitor——方法執行監控
  • watch——方法執行資料觀測
  • trace——方法内部調用路徑,并輸出方法路徑上的每個節點上耗時
  • stack——輸出目前方法被調用的調用路徑
  • tt——方法執行資料的時空隧道,記錄下指定方法每次調用的入參和傳回資訊,并能對這些不同的時間下調用進行觀測

options

  • options——檢視或設定 Arthas 全局開關

使用實列

  • trace 分析每個方法的具體執行時間
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

通過圖示表明調用 MongoTemplate.executeFindMultiInternal() 方法時,最耗時的方法是在 doWith() 方法,總共執行 10000 次,耗時 ==252.3064ms==,最少一次調用耗時 ==0.0132ms==,最大一次耗時 ==38.4329ms==,分析原因還是在于資料量太大,MongoTemplate 通過循環周遊出結果在進行序列化。

  • jad 反編譯代碼工具
jad com.sankuai.inf.leaf.common.ZeroIDGen           
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中
  • watch 檢視輸入參數與輸出參數
watch com.sankuai.inf.leaf.server.service.SegmentService getId '{params, target, returnObj}' -x 2           
params 表示入參,target 表示目前的類,returnObj 表示傳回值。
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中
  • stack 檢視被調用的路徑(向上)
stack com.sankuai.inf.leaf.server.service.SegmentService getId           
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中
  • sc 檢視 JVM 已加載的類資訊
sc -d com.sankuai.inf.leaf.server.service.SegmentService getId           
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中
  • thread 分析死鎖
thread b           
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

可以看出目前線程正在等待 ReentrantLock$NonfairSync@118f1fb4,而持有這個對象的線程又在等待目前線程釋放,進而形成死鎖!

  • thread 分析 CPU 占用
Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

總結

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

Arthas 初探--安裝初步适用Arthas 征文活動火熱進行中

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

Arthas 征文活動火熱進行中

Arthas 官方正在舉行征文活動,如果你有:

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

歡迎參加征文活動,還有獎品拿哦~

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