當線上碰到頭疼的問題時,還在對着代碼一行行的看?真的不太時髦了啊喂~
俗話說的好 “問題排查不用愁,Arthas 來幫您忙。” 今天就來說說這個讓媽媽再也不用擔心我排查問題的 Java 診斷神器——Arthas!
什麼是 Arthas?
Arthas 是一款開源線上診斷工具,采用指令行互動模式,支援 web 端線上診斷,同時提供豐富的 Tab 自動補全功能,進一步友善進行問題的定位和診斷。這是一款開源一年多 GitHub star 2 萬,99% 的阿裡研發小哥都在用的 Java 終極診斷利器!相對比直接下載下傳使用,我推薦開發者可以試一下通過 IDE插件 Cloud Toolkit 中使用Arthas 來實作一鍵遠端診斷功能。
得益于 Arthas 強大且豐富的功能,讓 Arthas 能做的事情超乎想象。下面僅僅列舉幾項常見的使用情況,更多的使用場景可以在熟悉了 Arthas 之後自行探索。
- 是否有一個全局視角來檢視系統的運作狀況?
- 為什麼 CPU 又升高了,到底是哪裡占用了 CPU ?
- 運作的多線程有死鎖嗎?有阻塞嗎?
- 程式運作耗時很長,是哪裡耗時比較長呢?如何監測呢?
- 這個類從哪個 jar 包加載的?為什麼會報各種類相關的 Exception?
- 我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法線上上 debug,難道隻能通過加日志再重新釋出嗎?
- 有什麼辦法可以監控到 JVM 的實時運作狀态?
Arthas 的指令、功能在其
官方文檔有詳細介紹,下文将介紹一下近期幾個使用場景。
場景 1:定位壓測時的性能瓶頸
平時伺服器請求都很正常。壓測時,依賴的服務、資料庫也都沒有到達瓶頸,但是機器的 CPU 全部飄紅,why?
通過 jstack 指令,隻能看到某一時刻的堆棧,沒有抓到真兇。
thread 檢視目前線程資訊,檢視線程的堆棧。
thread -n 3 -i 10000 可以統計 10 秒内最忙的 3 個線程,并且列印它們的堆棧,很容易發現問題。最終發現的問題比較簡單:日志中列印了 location 的資訊,包括 類名、方法名和行号。
動态擷取代碼的方法名、行号等資訊,通常是通過 new Throwable() -> 列印 Throwable 的堆棧 -> 截取堆棧中最頂層的業務代碼 -> 拆分字元串擷取類、方法、行号等資訊, 列印堆棧對性能損耗是比較大的。

場景 2:檢測偶發的逾時
有段時間,總是碰到幾次偶爾的逾時,但是看日志都正常,鷹眼的調用鍊路都完全 ok,沒有哪一步資料庫操作或者 HSF 調用是特别慢的。
各種監控統計的時間次元的耗時,都十分正常,無法找到那個 rt 的尖刺。
想到了可能是日志的問題,但是沒有證據支撐。
trace 指令能監控每一步的耗時,并且可以配合條件表達式,當耗時超過 xx ms 時列印詳細日志。
找台機器,輸入指令,後面的就是靜等了。再次出現 rt 尖刺時,能夠捕捉到耗時的分布情況。
通過 Arthas 拿到的結果,定位到是日志列印的問題。同步日志改為異步日志後,問題解決。
場景3:debug?那要是動态位元組碼生成咋辦?
之前碰到過一個 json 序列化時輸出的數字帶不帶引号的問題。當時各種 debug、看代碼,發現是通過 ASM 動态位元組碼的方式生成的序列化類。到這完全放棄了,debug 已經無法定位問題了。當時通過另外一種方式避免了這種問題。
反過來看這個問題的時候,我們可以通過 Arthas 的 jad 指令,反編譯動态位元組碼生成的類,結合 watch 等指令,定位排查問題。
jad——反編譯指定已加載類的源碼
還可以通過 mc(menory compiler), redefine 指令線上熱更新代碼,歡迎探索。
有了這些能力就算萬能了?不不,接着往下看。
場景 4:做點壞事
在問題排查過程中,發現了日志輸出到了控制台,這個對性能的損耗是比較大的。有什麼辦法,在不釋出的情況下緊急解決它?
首先找到對應的 class
sc -d ch.qos.logback.core.ConsoleAppender
class-info ch.qos.logback.core.ConsoleAppender
code-source /home/admin/.../lib/logback-core-1.2.3.jar
name ch.qos.logback.core.ConsoleAppender
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name ConsoleAppender
modifier public
annotation
interfaces
super-class +-ch.qos.logback.core.OutputStreamAppender
+-ch.qos.logback.core.UnsynchronizedAppenderBase
+-ch.qos.logback.core.spi.ContextAwareBase
+-java.lang.Object
class-loader +-com.taobao..LaunchedURLClassLoader@58dad04a
+-sun.misc.Launcher$AppClassLoader@18b4aac2
+-sun.misc.Launcher$ExtClassLoader@58ceff1
classLoaderHash 5f205aa
然後擷取 class 的屬性資訊,找到 appender 清單
ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList'
删除标準輸出的 appender
1ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList.remove(0)'
神器:火焰圖
排查性能問題的時候,還有一個神器:火焰圖通過火焰圖,很清晰的看到一段時間内,對每個方法耗時的統計。
開始使用 Arthas
方式一:通過Cloud Toolkit 實作 Arthas 一鍵遠端診斷
Cloud Toolkit 是阿裡雲釋出的免費本地 IDE 插件,幫助開發者更高效地開發、測試、診斷并部署應用。通過插件,可以将本地應用一鍵部署到任意伺服器,甚至雲端(ECS、EDAS、ACK、ACR 和 小程式雲等);并且還内置了 Arthas 診斷、Dubbo工具、Terminal 終端、檔案上傳、函數計算 和 MySQL 執行器等工具。不僅僅有 IntelliJ IDEA 主流版本,還有 Eclipse、Pycharm、Maven 等其他版本。
推薦使用 IDEA 插件下載下傳 Cloud Toolkit 來使用 Arthas:
http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8方式二:直接下載下傳
位址:
https://github.com/alibaba/arthasArthas 有獎征文開始啦!
為了讓更多開發者開始用上 Arthas 這個Java 診斷神器,這一次我們聯合 JetBrains 推出這次有獎征文活動,聊聊這些年你和 Arthas 之間的那些事兒。第一期征文活動将與3月26日——4月26日舉辦,後續征文活動将持續至2020年12月。
内容方向建議:
- 使用 Arthas 排查過的問題
- 對 Arthas 進行源碼解讀
- 對 Arthas 提出建議
- 不限,其它與 Arthas 有關的内容
3 步送出征文
1、直接使用 Arthas 或通過 Cloud Tookit 使用 Arthas;
2、将你的體驗整理成文章釋出在掘金社群;
3、按要求填寫以下表單:
http://alibabadeveloper.mikecrm.com/9khcRrs你将獲得的禮物
- 凡送出滿足投稿要求文章的同學,将獲得 Arthas Most Valuable User 福袋一份(禮品随機),包含淘公仔、Arthas 貼紙、阿裡雲 T 恤、JetBrains 周邊禮包;
- 第一期最受歡迎的 top3 的文章,獲得天貓精靈一台;
- 年度 top 20 文章,将有機會獲得 cherry 鍵盤及 JetBrains 提供的包括 Coupon 等周邊禮包 。
你将獲得的榮譽
除了實物獎勵之外,你還會獲得:
- 在阿裡巴巴雲原生公衆号和 Arthas 技術社群的首頁,展示您的文章及作者介紹子產品,讓更多的開發者了解你;
- 成為 Arthas 社群的貢獻者,參與社群的日常營運,并作為社群講師參與 Arthas 線上/線下活動分享。