性能測試如何定位瓶頸?偶發超時?看高手如何快速排查問題

lALPGqGoY4ELYOHNAg7NBDg_1080_526.png
做者 | [張奇(司楚)]java

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

1.jpeg

俗話說的好 「問題排查不用愁,Arthas 來幫您忙。」 今天就來講說這個讓媽媽不再用擔憂我排查問題的 Java 診斷神器——Arthas!github

什麼是 Arthas?

Arthas 是一款開源在線診斷工具,採用命令行交互模式,支持 web 端在線診斷,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。這是一款開源一年多 GitHub star 2 萬,99% 的阿里研發小哥都在用的 Java 終極診斷利器!相對比直接下載使用,我推薦開發者能夠試一下經過 IDE插件 Cloud Toolkit 中使用Arthas 來實現一鍵遠程診斷功能。web

得益於 Arthas 強大且豐富的功能,讓 Arthas 能作的事情超乎想象。下面僅僅列舉幾項常見的使用狀況,更多的使用場景能夠在熟悉了 Arthas 以後自行探索。數據庫

  • 是否有一個全局視角來查看系統的運行情況?
  • 爲何 CPU 又升高了,究竟是哪裏佔用了 CPU ?
  • 運行的多線程有死鎖嗎?有阻塞嗎?
  • 程序運行耗時很長,是哪裏耗時比較長呢?如何監測呢?
  • 這個類從哪一個 jar 包加載的?爲何會報各類類相關的 Exception?
  • 我改的代碼爲何沒有執行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題沒法在線上 debug,難道只能經過加日誌再從新發布嗎?
  • 有什麼辦法能夠監控到 JVM 的實時運行狀態?

Arthas 的命令、功能在其官方文檔有詳細介紹,下文將介紹一下近期幾個使用場景。json

場景 1:定位壓測時的性能瓶頸

平時服務器請求都很正常。壓測時,依賴的服務、數據庫也都沒有到達瓶頸,可是機器的 CPU 所有飄紅,why?小程序

經過 jstack 命令,只能看到某一時刻的堆棧,沒有抓到真兇。服務器

thread 查看當前線程信息,查看線程的堆棧。多線程

thread -n 3 -i 10000 能夠統計 10 秒內最忙的 3 個線程,而且打印它們的堆棧,很容易發現問題。最終發現的問題比較簡單:日誌中打印了 location 的信息,包括 類名、方法名和行號。app

動態獲取代碼的方法名、行號等信息,一般是經過 new Throwable() -> 打印 Throwable 的堆棧 -> 截取堆棧中最頂層的業務代碼 -> 拆分字符串獲取類、方法、行號等信息, 打印堆棧對性能損耗是比較大的。

2.png

場景 2:檢測偶發的超時

有段時間,老是碰到幾回偶爾的超時,可是看日誌都正常,鷹眼的調用鏈路都徹底 ok,沒有哪一步數據庫操做或者 HSF 調用是特別慢的。

各類監控統計的時間維度的耗時,都十分正常,沒法找到那個 rt 的尖刺。

想到了多是日誌的問題,可是沒有證據支撐。

trace 命令能監控每一步的耗時,而且能夠配合條件表達式,當耗時超過 xx ms 時打印詳細日誌。

找臺機器,輸入命令,後面的就是靜等了。再次出現 rt 尖刺時,可以捕捉到耗時的分佈狀況。

3.png

經過 Arthas 拿到的結果,定位到是日誌打印的問題。同步日誌改成異步日誌後,問題解決。

場景3 debug?那要是動態字節碼生成咋辦?

以前碰到過一個 json 序列化時輸出的數字帶不帶引號的問題。當時各類 debug、看代碼,發現是經過 ASM 動態字節碼的方式生成的序列化類。到這徹底放棄了,debug 已經沒法定位問題了。當時經過另一種方式避免了這種問題。

反過來看這個問題的時候,咱們能夠經過 Arthas 的 jad 命令,反編譯動態字節碼生成的類,結合 watch 等命令,定位排查問題。

jad——反編譯指定已加載類的源碼

4.png

還能夠經過 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)'

神器:火焰圖

排查性能問題的時候,還有一個神器:火焰圖經過火焰圖,很清晰的看到一段時間內,對每一個方法耗時的統計。

5.png

開始使用 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<br />

方式二:直接下載

地址:https://github.com/alibaba/arthas

Arthas 有獎徵文開始啦!

6.png

爲了讓更多開發者開始用上 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 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術圈。」

相關文章
相關標籤/搜索