這四個問題場景你會排查原因嗎?看看高手是如何快速定位原因的!
作者 | 張奇(司楚)
當線上碰到頭疼的問題時,還在對著程式碼一行行的看?真的不太時髦了啊喂~
俗話說的好 “
問題排查不用愁,Arthas 來幫您忙
。” 今天就來說說這個讓媽媽再也不用擔心我排查問題的 Java 診斷神器:Arthas!
什麼是 Arthas?
Arthas 是一款開源線上診斷工具,採用命令列互動模式,支援 web 端線上診斷,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。相對比直接下載使用,我推薦開發者可以試一下透過 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——反編譯指定已載入類的原始碼
還有什麼?
有了這些能力就算萬能了?不不,接著往下看。
場景 4:做點壞事
在問題排查過程中,發現了日誌輸出到了控制檯,這個對效能的損耗是比較大的。有什麼辦法,在不釋出的情況下緊急解決它?
首先找到對應的 class
然後獲取 class 的屬性資訊,找到 appender 列表
刪除標準輸出的 appender
神器:火焰圖
排查效能問題的時候,還有一個神器:火焰圖透過火焰圖,很清晰的看到一段時間內,對每個方法耗時的統計。
開始使用 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 診斷神器,這一次我來發獎你來說,聊聊這些年你和 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 周邊禮包;
第一期最受歡迎的 Top 3 文章,獲得天貓精靈一臺;
年度 Top 20 文章,將有機會獲得 Cherry 鍵盤及 JetBrains 提供的包括 Coupon 等周邊禮包。
你將獲得的榮譽
除了實物獎勵之外,你還會獲得:
在阿里巴巴雲原生公眾號和 Arthas 技術社群的首頁,展示您的文章及作者介紹模組,讓更多的開發者瞭解你;
成為 Arthas 社群的貢獻者,參與社群的日常運營,並作為社群講師參與 Arthas 線上/線下活動分享。