問:如何定位是哪個服務(wù)進程導(dǎo)致CPU過載殿雪,哪個線程導(dǎo)致CPU過載朽色,哪段代碼導(dǎo)致CPU過載诈豌?
步驟一、找到最耗CPU的進程
工具:top
方法:
執(zhí)行top -c 云矫,顯示進程運行信息列表
鍵入P (大寫p)膳沽,進程按照CPU使用率排序
圖示:
線上服務(wù)CPU100%問題快速定位實戰(zhàn)
如上圖,最耗CPU的進程PID為10765
步驟二:找到最耗CPU的線程
工具:top
方法:
top -Hp 10765 让禀,顯示一個進程的線程運行信息列表
鍵入P (大寫p)挑社,線程按照CPU使用率排序
圖示:
線上服務(wù)CPU100%問題快速定位實戰(zhàn)
如上圖,進程10765內(nèi)巡揍,最耗CPU的線程PID為10804
步驟三:將線程PID轉(zhuǎn)化為16進制
工具:printf
方法:printf “%x” 10804
圖示:
線上服務(wù)CPU100%問題快速定位實戰(zhàn)
如上圖痛阻,10804對應(yīng)的16進制是0x2a34,當然腮敌,這一步可以用計算器阱当。
之所以要轉(zhuǎn)化為16進制俏扩,是因為堆棧里,線程id是用16進制表示的弊添。
步驟四:查看堆棧动猬,找到線程在干嘛
工具:pstack/jstack/grep
方法:jstack 10765 | grep ‘0x2a34’ -C5 --color
打印進程堆棧
通過線程id,過濾得到線程堆棧
圖示:
線上服務(wù)CPU100%問題快速定位實戰(zhàn)
如上圖表箭,找到了耗CPU高的線程對應(yīng)的線程名稱“AsyncLogger-1”赁咙,以及看到了該線程正在執(zhí)行代碼的堆棧。