天天看點

Java應用後端響應慢問題排查思路

作者:GavinDjp

Java應用後端響應慢問題排查思路

java應用後端響應緩慢,在未知是否資料庫寫入讀取慢、網絡鍊路正常的情況下,應該如何排查。

這裡引入arthas 的排查思路。(arthas 需要JDK 1.6 以上,且僅支援Java應用,指令詳細使用見官方文檔:https://arthas.aliyun.com/doc/)

java應用響應慢,較大機率是資料庫響應慢、自身Full GC以及業務邏輯過于複雜。鍊路調用的網絡問題在此不做讨論

一、擷取前端通路的後端接口

java 後端應用響應緩慢,需要先确認是哪個接口的傳回較慢。

  • WEB應用:可通過前端浏覽器,開發者工具,network 檢視前端耗時較長的接口,逐層定位
  • 是以應用适用:根據日志調用資訊,排查耗時較高的接口,串聯日志排查(比如根據業務資料在日志中的路徑,trace ID 等)
  • 如果有全鍊路監控,接口監控(如zipkin、pinpoint等),根據接口定位響應緩慢的接口
  • 簡單粗暴,和研發确認該功能的調用棧
  • 通過arthas monitor 指令監控可疑方法

[arthas@123]$ monitor -c 5 demo.MathGame primeFactors #每隔5秒列印一次類demo.MathGame中方法primeFactors的調用情況

Java應用後端響應慢問題排查思路

二、知道了響應緩慢的接口,如何進行下一步排查

通過第一步,我們基本确認了是哪個接口響應慢,接下來,借用arthas進行下一步分析。

首先應排除是否資料庫響應慢導緻,該步驟不在此讨論

1、 檢查應用GC 情況,可通過監控、GC log來檢視,在arthas 中,可通過dashboard 檢視,GC 問題可通過heapdump、threaddump 分析。

[arthas@123]$ dashboard  #arthas 控制台
[arthas@123]$ jvm #jvm基本資訊
[arthas@123]$ heapdump --live /tmp/dump.hprof  #列印heapdump 資訊,類似jmap:jmap -dump:[live,]format=b,file=/tmp/dump.hprof <pid>

#使用jdk 自帶指令檢視GC資訊
$ jstack -l <pid>
$ jstack[ option ] pid
           
Java應用後端響應慢問題排查思路

dashboard 結果圖示

2、檢視是否有線程死鎖、線程阻塞。通過thread 檢視線程資訊

[arthas@123]$ thread  #檢視所有線程資訊
[arthas@123]$ thread 23 #檢視線程ID是23 的線程
[arthas@123]$ thread -b #檢視阻塞線程,block 線程
[arthas@123]$ thread -n 3 #檢視最繁忙的3個線程           
Java應用後端響應慢問題排查思路

3、但無法确實是線程等待、block的原因時,通過trace 檢視調用鍊路及耗時

根據逐層查到耗時高的方法排查

[arthas@123]$ trace com.XXXController XXX # trace 類 方法
[arthas@123]$ trace com.XXXController XXX -n 3 # 捕捉到3次後退出
[arthas@123]$ trace com.XXXController XXX '#cost > 10' #耗時大于10ms 的請求
#更詳細用法參考官方文檔           
Java應用後端響應慢問題排查思路

4、根據逐層排查到的方法,最終應用是在哪裡響應較慢,結合代碼邏輯進行分析定位根因

比如是調用資料庫傳回較慢,最後一層調用應該是資料庫連接配接層耗時較高。

繼續閱讀