Linux CPU負載過高排查方法
- 2019 年 11 月 3 日
- 筆記
問:如何定位是哪個服務進程導致CPU過載,哪個執行緒導致CPU過載,哪段程式碼導致CPU過載?
步驟一、找到最耗CPU的進程
工具:top
方法:
- 執行top -c ,顯示進程運行資訊列表
- 鍵入P (大寫p),進程按照CPU使用率排序
圖示:
如上圖,最耗CPU的進程PID為10765
步驟二:找到最耗CPU的執行緒
工具:top
方法:
- top -Hp 10765 ,顯示一個進程的執行緒運行資訊列表
- 鍵入P (大寫p),執行緒按照CPU使用率排序
圖示:
如上圖,進程10765內,最耗CPU的執行緒PID為10804
步驟三:將執行緒PID轉化為16進位
工具:printf
方法:printf 「%x」 10804
圖示:
如上圖,10804對應的16進位是0x2a34,當然,這一步可以用計算器。
之所以要轉化為16進位,是因為堆棧里,執行緒id是用16進位表示的。
步驟四:查看堆棧,找到執行緒在幹嘛
工具:pstack/jstack/grep
方法:jstack 10765 | grep 『0x2a34』 -C5 –color
- 列印進程堆棧
- 通過執行緒id,過濾得到執行緒堆棧
圖示:
如上圖,找到了耗CPU高的執行緒對應的執行緒名稱「AsyncLogger-1」,以及看到了該執行緒正在執行程式碼的堆棧。