cpu飙高是很常見的線上問題,這都不會的話,屬實有點拉跨

兄弟萌不用慌,來我教你一套連招
先來個項目,整個api,到時候我們請求/cpu/{count}就能手動拉高cpu,機智鬼~
@GetMapping("/cpu/{count}")
public long cpuTest(@PathVariable("count") long count) {
long number = 0;
for (int i = 0; i < count; i++) {
number++;
}
return number;
}
打包、上傳、啟動
跑起來了,記住這個程序号 14849
我們先top看看正常情況下的cpu使用率
很合理
模拟線上cpu飙高
我們請求/cpu/{100000000000}接口,把cpu拉起來,同時top觀察cpu使用率
直接幹到98%,很nice
ok入戲,我們現線上上出問題了,cpu一直很高,老大叫你找找原因,開始支棱起來
其實我們現在已經知道是誰把cpu拉高了,但還不夠細,隻知道哪個項目出的問題遠遠不夠,我們應該找到罪魁禍首,到底是哪個方法的多少行導緻的問題,這才能讓老大直呼内行
先說步驟:
jps+top 定位應用程序 pid
top -Hp {pid}找到線程 tid
将 tid 轉換成十六進制 printf “%x\n” {tid}
列印堆棧資訊 jstack
過濾出我們想要的
ok開始排查
程序id已經确定是 14849,下一步我們要找到是哪個線程搞的鬼
top -Hp 14849
很明顯是這個14908搞的鬼
轉十六進制
列印堆棧
堆棧資訊顯示是TestController裡面的第20行出的幺蛾子,我們進入代碼驗證
問題不大
破案
撒花