做者 | [張奇(司楚)]java
當線上碰到頭疼的問題時,還在對着代碼一行行的看?真的不太時髦了啊喂~git
俗話說的好 「問題排查不用愁,Arthas 來幫您忙。」 今天就來講說這個讓媽媽不再用擔憂我排查問題的 Java 診斷神器——Arthas!github
Arthas 是一款開源在線診斷工具,採用命令行交互模式,支持 web 端在線診斷,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。這是一款開源一年多 GitHub star 2 萬,99% 的阿里研發小哥都在用的 Java 終極診斷利器!相對比直接下載使用,我推薦開發者能夠試一下經過 IDE插件 Cloud Toolkit 中使用Arthas 來實現一鍵遠程診斷功能。web
得益於 Arthas 強大且豐富的功能,讓 Arthas 能作的事情超乎想象。下面僅僅列舉幾項常見的使用狀況,更多的使用場景能夠在熟悉了 Arthas 以後自行探索。數據庫
Arthas 的命令、功能在其官方文檔有詳細介紹,下文將介紹一下近期幾個使用場景。json
平時服務器請求都很正常。壓測時,依賴的服務、數據庫也都沒有到達瓶頸,可是機器的 CPU 所有飄紅,why?小程序
經過 jstack 命令,只能看到某一時刻的堆棧,沒有抓到真兇。服務器
thread 查看當前線程信息,查看線程的堆棧。多線程
thread -n 3 -i 10000 能夠統計 10 秒內最忙的 3 個線程,而且打印它們的堆棧,很容易發現問題。最終發現的問題比較簡單:日誌中打印了 location 的信息,包括 類名、方法名和行號。app
動態獲取代碼的方法名、行號等信息,一般是經過 new Throwable() -> 打印 Throwable 的堆棧 -> 截取堆棧中最頂層的業務代碼 -> 拆分字符串獲取類、方法、行號等信息, 打印堆棧對性能損耗是比較大的。
有段時間,老是碰到幾回偶爾的超時,可是看日誌都正常,鷹眼的調用鏈路都徹底 ok,沒有哪一步數據庫操做或者 HSF 調用是特別慢的。
各類監控統計的時間維度的耗時,都十分正常,沒法找到那個 rt 的尖刺。
想到了多是日誌的問題,可是沒有證據支撐。
trace 命令能監控每一步的耗時,而且能夠配合條件表達式,當耗時超過 xx ms 時打印詳細日誌。
找臺機器,輸入命令,後面的就是靜等了。再次出現 rt 尖刺時,可以捕捉到耗時的分佈狀況。
經過 Arthas 拿到的結果,定位到是日誌打印的問題。同步日誌改成異步日誌後,問題解決。
以前碰到過一個 json 序列化時輸出的數字帶不帶引號的問題。當時各類 debug、看代碼,發現是經過 ASM 動態字節碼的方式生成的序列化類。到這徹底放棄了,debug 已經沒法定位問題了。當時經過另一種方式避免了這種問題。
反過來看這個問題的時候,咱們能夠經過 Arthas 的 jad 命令,反編譯動態字節碼生成的類,結合 watch 等命令,定位排查問題。
jad——反編譯指定已加載類的源碼
還能夠經過 mc(menory compiler), redefine 命令線上熱更新代碼,歡迎探索。
有了這些能力就算萬能了?不不,接着往下看。
在問題排查過程當中,發現了日誌輸出到了控制檯,這個對性能的損耗是比較大的。有什麼辦法,在不發佈的狀況下緊急解決它?
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
ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList'
1ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList.remove(0)'
排查性能問題的時候,還有一個神器:火焰圖經過火焰圖,很清晰的看到一段時間內,對每一個方法耗時的統計。
方式一:經過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<br />
方式二:直接下載
地址:https://github.com/alibaba/arthas。
爲了讓更多開發者開始用上 Arthas 這個Java 診斷神器,這一次咱們聯合 JetBrains 推出此次有獎徵文活動,聊聊這些年你和 Arthas 之間的那些事兒。第一期徵文活動將與3月26日——4月26日舉辦,後續徵文活動將持續至2020年12月。
內容方向建議:
除了實物獎勵以外,你還會得到
「阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」