天天看點

linux cpu飙高原因排查(有手就行)

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

linux 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;
    }      

打包、上傳、啟動

linux cpu飙高原因排查(有手就行)

跑起來了,記住這個程序号 14849

我們先top看看正常情況下的cpu使用率

linux cpu飙高原因排查(有手就行)

很合理

模拟線上cpu飙高

我們請求/cpu/{100000000000}接口,把cpu拉起來,同時top觀察cpu使用率

linux 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      
linux cpu飙高原因排查(有手就行)

很明顯是這個14908搞的鬼

轉十六進制

linux cpu飙高原因排查(有手就行)

列印堆棧

linux cpu飙高原因排查(有手就行)

堆棧資訊顯示是TestController裡面的第20行出的幺蛾子,我們進入代碼驗證

linux cpu飙高原因排查(有手就行)

問題不大

破案

撒花

繼續閱讀