天天看點

性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

作者 | [張奇(司楚)]

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

性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

俗話說的好 “問題排查不用愁,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 的堆棧 -> 截取堆棧中最頂層的業務代碼 -> 拆分字元串擷取類、方法、行号等資訊, 列印堆棧對性能損耗是比較大的。

性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

場景 2:檢測偶發的逾時

有段時間,總是碰到幾次偶爾的逾時,但是看日志都正常,鷹眼的調用鍊路都完全 ok,沒有哪一步資料庫操作或者 HSF 調用是特别慢的。

各種監控統計的時間次元的耗時,都十分正常,無法找到那個 rt 的尖刺。

想到了可能是日志的問題,但是沒有證據支撐。

trace 指令能監控每一步的耗時,并且可以配合條件表達式,當耗時超過 xx ms 時列印詳細日志。

找台機器,輸入指令,後面的就是靜等了。再次出現 rt 尖刺時,能夠捕捉到耗時的分布情況。

性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

通過 Arthas 拿到的結果,定位到是日志列印的問題。同步日志改為異步日志後,問題解決。

場景3 debug?那要是動态位元組碼生成咋辦?

之前碰到過一個 json 序列化時輸出的數字帶不帶引号的問題。當時各種 debug、看代碼,發現是通過 ASM 動态位元組碼的方式生成的序列化類。到這完全放棄了,debug 已經無法定位問題了。當時通過另外一種方式避免了這種問題。

反過來看這個問題的時候,我們可以通過 Arthas 的 jad 指令,反編譯動态位元組碼生成的類,結合 watch 等指令,定位排查問題。

jad ——反編譯指定已加載類的源碼
性能測試如何定位瓶頸?偶發逾時?看高手如何快速排查問題什麼是 Arthas?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

還可以通過

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?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 ArthasArthas 有獎征文開始啦!

開始使用 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?場景 1:定位壓測時的性能瓶頸場景 2:檢測偶發的逾時場景3 debug?那要是動态位元組碼生成咋辦?開始使用 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 線上/線下活動分享。
阿裡巴巴雲原生 關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”