JAVA項目 CPU占用率100%排查五步法

一、前言

你有沒有遇到過這種情況,Linux服務(wù)器CPU占用率達(dá)到100%且一直居高不下,嚴(yán)重影響業(yè)務(wù)系統(tǒng)的正常使用,這時候領(lǐng)導(dǎo)讓你來排查問題原因,如果不知道該如何下手,就有點尷尬了。

image-20230613081446144.png
二、排查五步法

排查思路總共分為五步,按照步驟操作,只要你有手就行。正確的排查方法,有助于快速的定位并解決問題。

  1. top 命令定位應(yīng)用進(jìn)程 pid
  2. top -Hp [pid] 定位應(yīng)用進(jìn)程對應(yīng)的線程 tid
  3. printf "%x\n" [tid] 將tid轉(zhuǎn)換為十六進(jìn)制
  4. jstack [pid] | grep -A 10 [tid的十六進(jìn)制] 打印堆棧信息
  5. 根據(jù)堆棧信息分析問題
三、示例實戰(zhàn)

示例代碼

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * CPU占用率測試方法
 */
@RequestMapping("/api")
@RestController
public class CpuTestController {

    @GetMapping("/cpu/{count}")
    public long cpuRunning(@PathVariable("count") long count) {
        long result = 0;
        for (int i = 0; i < count; i++) {
            result++;
        }
        return result;
    }

}

調(diào)用接口:curl http://localhost:8080/api/cpu/10000000000,發(fā)現(xiàn)CPU一會兒就飆到了100%,接下來我們按五步法探個究竟。

第一步:找到最耗CPU的進(jìn)程pid

// 執(zhí)行 top 命令,按shift + p 組合鍵,按照CPU占用率排序
top 
image-20230613081813516.png

從圖中,我們可以看到進(jìn)程pid為 24060 的占用CPU是最高的,直接是100%。

第二步:找到最耗CPU的線程tid

// 執(zhí)行 top -Hp [pid] 定位應(yīng)用進(jìn)程對應(yīng)的線程 tid
// 按shift + p 組合鍵,按照CPU占用率排序
top -Hp 24060
image-20230613081934103.png

從圖中,我們可以看到線程tid為 24077 占用CPU是最高的,達(dá)到99.9%。

第三步:將線程pid轉(zhuǎn)化為16進(jìn)制

// printf "%x\n" [tid]  將tid轉(zhuǎn)換為十六進(jìn)制
// 5e0d
printf "%x\n" 24077

第四步:查看線程的堆棧信息

// jstack [pid] | grep -A 10 [tid的十六進(jìn)制]  打印堆棧信息
jstack 24060 | grep -A 10 5e0d
image-20230613082203067.png

我們不難發(fā)現(xiàn)原來是 CpuTestController 的第18行出現(xiàn)了問題。

第五步:根據(jù)堆棧信息分析問題

找到對應(yīng)的代碼看一下,定位問題,優(yōu)化代碼邏輯

image-20230613082334766.png
四、總結(jié)

當(dāng)然,除了使用上面的基礎(chǔ)方法外,還有很多工具可以直接使用,例如阿里的Arthas。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容