CPU異常通常有如下幾個原因:
- 業務邏輯問題(死循環)
- 頻繁GC
- 上下文切換較多
其中, 業務邏輯問題可以使用jstack
來分析對應的堆棧情況。
一、使用jstack來分析cpu問題的步驟
1. 使用top命令,查看CPU占用較高的服務進程
通過top命令,最前面一列是對應的進程pid
2. 使用top -H -p pid
找到進程中占用cpu較高的線程
3. 將占用最高的pid轉換為16進制的nid
printf '%x\n' pid
4. 在jstack中找到堆棧信息
jstack pid | grep 'nid' -C5 -color
此時必然可以看到對應的nid的堆棧信息。剩下的只要仔細分析即可。
分析的時候,需要重點關注WAITTING
和TIMED_WAITING
的部分,BLOCKED
就不用說了。
可以使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c
來對jstack狀態做一個整體的把握,如果WAITING
之類的特別多,多半是有問題的。
二、使用jstat分析GC情況
jstat -gc pid 1000
該命令可以實現對GC分代情況進行觀察,1000表示采樣間隔(ms),S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU分別表示兩個Survivor區,Eden區、老年代、元數據區的容量和使用量。
YGC/YGT、FGC/FGCT、GCT 則代表YoungGC、FullGC的耗時和次數,以及總耗時。
如果看到gc比較頻繁,再針對gc方面做進一步分析。
三、 使用vmstat分析上下文切換
針對頻繁的上下文切換問題,我們可以使用vmstat命令來進行查看。
其中,cs(context switch)一列則代表上下文切換的次數。
擴展
如果要對特定的pid進行監控,可以使用pidstat -w pid
命令,cswch和nvcswch表示自愿以及非自愿切換。