線上上運作的伺服器,被發現cpu占用率高的問題。
贈送一個工具齊全的jdk安裝(包括tools.jar,jmap ....)
yum install -y java-1.8.0-openjdk-devel-debug
第一步:top指令
一般cpu占用率搞和記憶體占用高,都是先用top看一看詳情,top後可以按p來按照cpu使用率排序程序。
這邊用的圖不是發生問題機器,主要是記錄一下思路和方法
通過top我們可以發現cpu占用率高的pid,記錄一下
第二步:ps -ef |grep pid
檢視該程序運作的是什麼項目
第三步:top -H -p pid
檢視該程序下的各線程使用資源情況
第四步:jstack
使用jstack pid 可以檢視線程資訊,一般線程資訊比較多,用grep也看不出來啥 建議把資訊輸入到文本,使用vim或者本地分析
可以看出線程的狀态,上圖的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了
還可以看出 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