臨近月底,用戶量上來,發現業務進程頻繁從Eureka上掉下來,觀察後發現掉下來前進程CPU一直佔用比較高。
排查步驟以下:
1.使用top 定位到佔用CPU高的進程PID
top
2.獲取線程信息,並找到佔用CPU高的線程
ps -mp pid -o THREAD,tid,time | sort -rn
3.將須要的線程ID轉換爲16進制格式
printf "%x\n" tid
4.打印線程的堆棧信息
jstack pid |grep tid -A 30
同時發現數據庫鏈接有報「Connection reset」的異常,一時也發現不了問題,將dbcp2鏈接池換成durid。
經過durid的spring監控發現(果然很是強大),仍是一樣的方法讀取行數很是大。
再仔細看代碼,發現某種狀況下,確實會讀取全量表數據。
優化代碼後,問題解決。