假設絮吵,服務器上部署了若干Java站點服務,以及若干Java微服務忱屑,突然收到運維的CPU異常告警蹬敲。如何定位是哪個服務進程導致CPU過載,哪個線程導致CPU過載莺戒,哪段代碼導致CPU過載伴嗡?
簡要步驟如下:
(1)找到最耗CPU的進程;
(2)找到最耗CPU的線程脏毯;
(3)查看堆棧闹究,定位線程在干嘛幔崖,定位對應代碼食店;
步驟一、找到最耗CPU的進程
工具:top方法:
- 執(zhí)行top -c 赏寇,顯示進程運行信息列表
- 鍵入P (大寫p)吉嫩,進程按照CPU使用率排序
image
如上圖,最耗CPU的進程PID為10765嗅定。步驟二:找到最耗CPU的線程****工具:top方法:
- top -Hp 10765 自娩,顯示一個進程的線程運行信息列表
- 鍵入P (大寫p),線程按照CPU使用率排序
image
如上圖渠退,進程10765內忙迁,最耗CPU的線程PID為10804。步驟三:查看堆棧碎乃,定位線程在干嘛姊扔,定位對應代碼 首先,將線程PID轉化為16進制梅誓。工具:printf方法:printf "%x\n" 10804圖示:
image
如上圖恰梢,10804對應的16進制是0x2a34,當然丈牢,這一步可以用計算器紊遵。之所以要轉化為16進制怖亭,是因為堆棧里,線程id是用16進制表示的摧茴。接著,查看堆棧埂陆,找到線程在干嘛苛白。工具:jstack方法:jstack 10765 | grep '0x2a34' -C5 --color
- 打印進程堆棧
- 通過線程id尘分,過濾得到線程堆棧
image
如上圖,找到了耗CPU高的線程對應的線程名稱“AsyncLogger-1”丸氛,以及看到了該線程正在執(zhí)行代碼的堆棧培愁。
最后,根據(jù)堆棧里的信息缓窜,找到對應的代碼定续,搞定!