
作者 | [張奇(司楚)]
當線上碰到頭疼的問題時,還在對着代碼一行行的看?真的不太時髦了啊喂~
俗話說的好 “問題排查不用愁,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/arthas。
Arthas 有獎征文開始啦!
為了讓更多開發者開始用上 Arthas 這個Java 診斷神器,這一次我們聯合 JetBrains 推出這次有獎征文活動,聊聊這些年你和 Arthas 之間的那些事兒。第一期征文活動将與3月26日——4月26日舉辦,後續征文活動将持續至2020年12月。
内容方向建議:
- 使用 Arthas 排查過的問題
- 對 Arthas 進行源碼解讀
- 對 Arthas 提出建議
- 不限,其它與 Arthas 有關的内容
3 步送出征文
- 直接使用 Arthas 或通過 Cloud Tookit 使用 Arthas;
- 将你的體驗整理成文章釋出在掘金社群;
- 按要求填寫以下表單: http://alibabadeveloper.mikecrm.com/9khcRrs
你将獲得的禮物
- 凡送出滿足投稿要求文章的同學,将獲得 Arthas Most Valuable User 福袋一份(禮品随機),包含淘公仔、Arthas 貼紙、阿裡雲 T 恤、JetBrains 周邊禮包;
- 第一期最受歡迎的 top3 的文章,獲得天貓精靈一台;
- 年度 top 20 文章,将有機會獲得 cherry 鍵盤及 JetBrains 提供的包括 Coupon 等周邊禮包 。
你将獲得的榮譽
除了實物獎勵之外,你還會獲得
- 在阿裡巴巴雲原生公衆号和 Arthas 技術社群的首頁,展示您的文章及作者介紹子產品,讓更多的開發者了解你;
- 成為 Arthas 社群的貢獻者,參與社群的日常營運,并作為社群講師參與 Arthas 線上/線下活動分享。
“ 阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”