你 get 線上問題排查的最優方式了嗎?

當線上碰到頭疼的問題時,還在對着代碼一行行的看?真的不太時髦了啊喂~

俗話說的好 “問題排查不用愁,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 步提交徵文

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 線上/線下活動分享。

點擊下方“閱讀原文”,報名參加活動!

本文縮略圖:icon by 金角大王

Tips:

# 點下“看”❤️

# 然後,公衆號對話框內發送“蜘蛛俠”,試試手氣?????

# 本期獎品是漫威蜘蛛俠之英雄歸來POP公仔(禿鷹)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章