1. 程式人生 > >排查tomcat伺服器CPU使用率過高

排查tomcat伺服器CPU使用率過高

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 "%x\n" 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使用率過高,多數是因為執行緒無法終止或出現死迴圈等原因,需具體問題具體分析。