天天看點

cpu占用高線上問題排查

線上上運作的伺服器,被發現cpu占用率高的問題。

贈送一個工具齊全的jdk安裝(包括tools.jar,jmap ....)
yum install -y java-1.8.0-openjdk-devel-debug 
           

第一步:top指令

一般cpu占用率搞和記憶體占用高,都是先用top看一看詳情,top後可以按p來按照cpu使用率排序程序。

這邊用的圖不是發生問題機器,主要是記錄一下思路和方法

通過top我們可以發現cpu占用率高的pid,記錄一下

cpu占用高線上問題排查

 第二步:ps -ef |grep pid

檢視該程序運作的是什麼項目

第三步:top -H -p  pid

檢視該程序下的各線程使用資源情況

cpu占用高線上問題排查

第四步:jstack

使用jstack pid 可以檢視線程資訊,一般線程資訊比較多,用grep也看不出來啥  建議把資訊輸入到文本,使用vim或者本地分析

cpu占用高線上問題排查

可以看出線程的狀态,上圖的nid是pid的16進制表示,可以使用指令printf "%x\n"  pid 檢視将pid轉成16進制的值

waiting on conditon 說明在等待被喚醒。Timer_WAITING則表示定時等待,waiting(parking)表示一直等條件喚醒。

- parking to wait for  <0x000000078598d080> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
           

 可以看出在等待位址為0x000000078598d080的資源,我們可以搜尋一下是誰對這個位址lock了

cpu占用高線上問題排查

還可以看出 GC的情況,這邊GC的挺多的,其實是這個程式寫的并不好,問題挺多的....

第五步:jstat -gcutil  pid 1000  10 

這裡可以看看gc的具體情況   1000表示1秒,10表示檢視10秒的資訊

S0C、S1C、S0U、S1U:Survivor 0和1區容量(Capacity)和使用量(Used)
EC、EU:Eden區容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年輕代GC次數和GC耗時
FGC、FGCT:Full GC次數和Full GC耗時
GCT:GC總耗時
           

附加調試常用指令

檢視實體cpu個數 
cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l  

檢視實體cpu中的core個數
cat /proc/cpuinfo |grep "cpu cores"|wc -l

邏輯cpu個數
cat /proc/cpuinfo |grep "processor"|wc -l