天天看點

Java應用CPU打滿故障處理

問題背景:某項目生産環境正常投用的xx業務系統,在某天下午業務組回報,xx業務系統用戶端及網頁版應用均無法登入,請求登入頁面無響應。

影響範圍:xx業務系統無法使用

排查思路:

一般情況下,Java應用占用CPU較高的原因大部分為以下兩種情況:

  1. 應用屬于計算密集型應用
  2. 應用方法中出現了死循環

排查過程:

1.首先檢視系統資源占用資訊,使用top看一下,定位到占用CPU較高的程序PID。

top           
Java應用CPU打滿故障處理

可以通過ps aux | grep PID指令,進一步确定是否tomcat程序出現了問題。

2.定位最耗cpu的線程,使用ps -mp pid -o THREAD,tid,time | sort -rn指令顯示線程清單,并找到占用CPU高的線程。其中 tid代碼線程ID,time代表這個線程的已運作時間。

ps -mp 17789 -o THREAD,tid,time|sort -rn           
Java應用CPU打滿故障處理

3.将需要的線程ID轉換為16進制格式。使用printf "%xn" tid指令,手動将線程ID轉換為16進制。

printf "%x\n" 18081           
Java應用CPU打滿故障處理

4.列印線程堆棧資訊,使用指令Jstack PID | grep tid –A line輸出line行線程堆棧資訊。

jstack pid |grep tid -A 30           
Java應用CPU打滿故障處理

在執行上述指令後會看到如圖所示堆棧資訊,找到nid=$(tid十六進制值)即可定位出現問題的代碼了!

5.接下來再回到代碼,分析下具體的代碼中的方法。對相應方法進行優化,若無可優化空間,則應進行應用伺服器擴容。

問題總結:

經排查,開發人員在xx業務系統中新增了一個報表查詢功能,且功能新增後直接在生産環境進行了發版。由于報表查詢的查詢SQL為添加過濾條件,導緻全表掃描,進而使得應用CPU打滿。

建議:

建議後期發版過程嚴格遵守應用釋出流程規範,按照研發->測試->上線流程進行應用釋出,并在上線前按照規範中的釋出申請、釋出審批等步驟對應用所需資源、SQL腳本等進行稽核。