字節(jié)面試:CPU100%,怎么快速定位?三步教你快速定位
作為開發(fā)人員或者運(yùn)維人員,如何快速定位到引起CPU過(guò)載的服務(wù)、線程,以及代碼,這對(duì)我們排查問(wèn)題至關(guān)重要。
今天分享一下我平時(shí)處理類似問(wèn)題的思路,希望對(duì)大家有所幫助!
步驟一:找到最耗CPU的進(jìn)程
當(dāng)我們發(fā)現(xiàn)服務(wù)器CPU出現(xiàn)異常高的負(fù)載時(shí),第一步要做的就是找到最消耗CPU資源的進(jìn)程。
我們可以使用top命令來(lái)查看當(dāng)前所有進(jìn)程的CPU使用情況。
工具: top方法:
- 執(zhí)行top -c命令,顯示進(jìn)程的運(yùn)行信息列表。
- 按下P鍵(大寫的P),可以按照CPU使用率對(duì)進(jìn)程進(jìn)行排序。
通過(guò)這種方式,我們可以很容易找到CPU使用率最高的進(jìn)程,假設(shè)最耗CPU的進(jìn)程的PID為10765,接下來(lái)我們就要深入挖掘了。
圖示:
如上圖,最耗CPU的進(jìn)程PID為10765。
步驟二:找到最耗CPU的線程
接下來(lái),定位到特定進(jìn)程后,我們要進(jìn)一步找到在該進(jìn)程內(nèi)最耗CPU的線程。
這一步同樣使用top命令,但這次我們需要使用-Hp選項(xiàng)來(lái)顯示該進(jìn)程內(nèi)所有線程的使用情況。
工具: top方法:
- 執(zhí)行top -Hp 10765命令,顯示進(jìn)程10765的線程運(yùn)行信息。
- 同樣按下P鍵(大寫的P),按CPU使用率排序線程。
這樣一來(lái),我們可以找到在進(jìn)程內(nèi)最占用CPU資源的線程,假設(shè)它的PID為10804。
圖示:
如上圖,進(jìn)程10765內(nèi)最耗CPU的線程PID為10804。
步驟三:查看堆棧,定位線程在干嘛,找到對(duì)應(yīng)代碼
此時(shí),我們已經(jīng)找到了導(dǎo)致CPU高負(fù)載的線程,接下來(lái)就是查看這個(gè)線程到底在做什么。
首先,我們需要將線程的PID從十進(jìn)制轉(zhuǎn)換為16進(jìn)制格式,因?yàn)槎褩P畔⒅校€程的ID通常是以16進(jìn)制表示的。
工具: printf方法:
- 執(zhí)行命令printf "%x\n" 10804,將線程PID轉(zhuǎn)化為16進(jìn)制。你也可以使用計(jì)算器來(lái)做這一步。 圖示:
圖片
- 如上圖,線程PID 10804對(duì)應(yīng)的16進(jìn)制是0x2a34。
接下來(lái),我們可以使用jstack命令查看該進(jìn)程的堆棧信息,并通過(guò)線程的ID過(guò)濾出該線程的堆棧,進(jìn)一步了解它在做什么。
工具: jstack方法:
- 執(zhí)行jstack 10765 | grep '0x2a34' -C5 --color命令,打印進(jìn)程10765的堆棧信息,并通過(guò)線程ID(0x2a34)來(lái)過(guò)濾并找到相關(guān)線程的堆棧。
圖示:
如上圖,找到了耗CPU高的線程對(duì)應(yīng)的線程名稱“AsyncLogger-1”,并且看到了該線程正在執(zhí)行代碼的堆棧。
根據(jù)堆棧信息,我們就可以追蹤到代碼中可能存在的性能瓶頸,進(jìn)而定位到具體的代碼位置。
總結(jié)
通過(guò)這三步,我們成功找到了導(dǎo)致CPU過(guò)載的線程以及相應(yīng)的代碼。希望這篇文章能夠幫助經(jīng)常進(jìn)行線上排查的同學(xué)們,如果你有更好的實(shí)踐或思路,也歡迎分享,大家一起進(jìn)步!






























