性能测试如何定位瓶颈?偶发超时?看高手如何快速排查问题
作者 |?張奇(司楚)
當線上碰到頭疼的問題時,還在對著代碼一行行的看?真的不太時髦了啊喂~
俗話說的好 “問題排查不用愁,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
-
然后獲取 class 的屬性信息,找到 appender 列表
-
刪除標準輸出的 appender
-
神器:火焰圖
排查性能問題的時候,還有一個神器:火焰圖通過火焰圖,很清晰的看到一段時間內,對每個方法耗時的統計。
?
開始使用 Arthas
-
方式一:推薦使用?IDEA?插件下載?Cloud Toolkit 來使用?Arthas
地址:
ttp://t.tb.cn/2A5CbHWveOXzI7sFakaCw8
Cloud Toolkit 是阿里云發布的免費本地 IDE 插件,幫助開發者更高效地開發、測試、診斷并部署應用。通過插件,可以將本地應用一鍵部署到任意服務器,甚至云端(ECS、EDAS、ACK、ACR 和小程序云等);并且還內置了 Arthas 診斷、Dubbo工具、Terminal 終端、文件上傳、函數計算 和 MySQL 執行器等工具。不僅僅有 IntelliJ IDEA 主流版本,還有 Eclipse、Pycharm、Maven 等其他版本。
-
方式二:直接下載
地址:
https://github.com/alibaba/arthas
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的性能测试如何定位瓶颈?偶发超时?看高手如何快速排查问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那些面试官,都是如何把候选人聊崩溃的
- 下一篇: 阿里云专家手把手教你重塑 IT 架构!