排查tomcat伺服器CPU使用率過高
- 2020 年 4 月 8 日
- 筆記
tomcat要運行依賴於JDK,tomcat伺服器的CPU使用率過高,大多都是因為部署的web程式的問題。
一、現象描述
在一次線上環境,前台訪問頁面的速度越來越慢,從瀏覽器F12中看到發出的請求都是pengding的狀態。
二、排查過程
我這裡tomcat部署在linux環境中。下面的排查過程均在linux下進行。
1、排查後台服務
查看tomcat的後台日誌,發現日誌正常列印,未發現異常資訊;把要執行的SQL複製出來,放到mysql的客戶端執行,發現sql運行正常且查詢速度正常。
通過上面的排查發現要訪問的功能正常,排除是當前功能造成的原因。
2、排查伺服器
1、找出耗CPU的進程
使用top命令查看特定用戶(user1)的記憶體、cpu及各進程的資訊,
top -u user1
使用上面的命令,可以看到下面的資訊,

從上面可以看到存在一個java的進程,由於我這裡沒有其他的java相關的進程,這裡可以判斷為tomcat的進程,這裡可以看到PID為47787,通過%CPU、%MEM分別表示CPU、記憶體的使用率,由於我這裡問題已經解決,所以看到CPU的使用率已經下來了,異常情況下可以是超過100%的數值。
這樣我們就可以找出使用CPU過高的進程。
還可以通過下面的命令來快速找到java進程,
jps
使用jps命令可以快速找到java進程的PID,如下圖

這裡可以看出PID為47787為tomcat進程。還可以使用下面的命令,
ps -ef |grep tomcat
上面的命令列印出下方的資訊,

回到正題,上面使用top命令找到了CPU過高的進程。
2、找出耗CPU的執行緒
在上一步中找到了耗CPU的進程,下面要找到耗CPU的執行緒。我們知道一個進程中可以有多個執行緒,進程是執行緒的集合。
使用下面的命令找到耗CPU的執行緒,
top -Hp 47787 上面的“47787”即上一步中找到進程id,意思就是找出該進程下的執行緒資訊。如下圖,

從上圖中可以看到該進程下的執行緒資訊,由於我這裡已經正常了,所以未看到CPU過高的執行緒,上圖中的PID這裡代表的是執行緒ID。假如47875這個執行緒的%CPU使用過高,
下面把該執行緒ID,轉化為16進位。
printf "%xn" 47875

從上圖可以看出47875的16進位為“bb03”。
上面,通過進程ID,找到了耗CPU的執行緒ID,並且轉化為了16進位。
3、從JVM堆棧中查找執行緒資訊
我們獲得了耗時較高的執行緒ID,下面通過JVM的堆棧資訊找到執行緒資訊,那麼如何獲得JVM的堆棧資訊那,使用下面的命令
jstack 47787 > ./jvm.log 上面的“47787”代表的是上面的進程ID,列印出47787進程的堆棧資訊,保存在當前目錄的jvm.log文件中。
下面從jvm.log文件中找到上面的執行緒資訊,
grep -rn bb03 ~/jvm.log -A 100
找到下面的資訊,

從上面可以看到是一些執行緒資訊,那要怎麼去排查那,可以通過上圖紅框中的狀態為RUNNABLE的執行緒資訊,即為正在運行的執行緒,從這裡可以找到相關的資訊,最終解決問題。
三、總結
CPU使用率過高,多數是因為執行緒無法終止或出現死循環等原因,需具體問題具體分析。

