一、前言
服務器上某個服務CPU異常告警,CPU使用率飆升到幾十百分百,甚至達到百分之幾百。
二、排查步驟
1、top命令查看進程
執行:top -c
,顯示進程運行信息列表。然後鍵入P (大寫p),進程按照CPU使用率排序。找到CPU消耗最高的進程,記錄進程的id(PID)。
2、找到進程中消耗最高的線程
執行:top -Hp 進程id
命令(小寫p),查看java進程下的所有線程佔CPU的情況。記錄CPU消耗最高的線程id(PID)。
top -Hp 2077
3、線程PID轉爲十六進制
將十進制的線程PID轉爲十六進制的數值,方法有多種。這裏介紹2種:
1)printf命令
在服務器上執行: printf “%x\n” 線程PID,可得到對應數字的十六進制。
printf "%x\n" 621
2)計算器
4、查看線程在幹嘛
使用jstack工具執行:jstack 進程ID | grep 線程ID(十六進制)
,查看線程的堆棧信息。然後根據堆棧信息查看對應代碼即可。
jstack 2077 | grep 26d
5、進一步分析
第4步驟中,如果打印出的線程帶有"VM Thread",說明是GC線程。此時有可能是頻繁服務GC操作導致。
1)jmap查看內存使用情況
執行: -heap 進程ID,在線查看各年代內存使用情況
2)導出dump日誌
執行:jmap -dump:format=b,file=filename 進程ID
,下載到本地,通過IDE可以打開,分析各類型對象創建情況。