CPU佔用高及問題排查

CPU異常往往是業務邏輯問題(死循環)、頻繁gc以及上下文切換過多。而最常見的往往是業務邏輯(或者框架邏輯)導致的,可以使用jstack來分析對應的堆棧情況,本文通過死循環方式重現CPU過高場景,並實例講解CPU過高問題排查的方式。

1.環境

  • Centos7 1核2GB
  • Java8

2.模擬cpu佔用高

創建 cpu-over-test 項目,添加了一個MyMainClazz類。裏面有一個可是要 java -jar 執行的Main方法
模擬代碼如下

public class MyMainClazz {

    public static void main(String[] args) {
        System.out.println("run start ...");
        while (true) {

        }
    }
}

cpu-over-test-1.0.jar
下載地址:https://pan.baidu.com/s/1-VTQ02qrb1l010MiFshHzw
密碼:iqjl

3.啓動模擬程序

  • cpu-over-test.jar上傳到服務器
  • 啓動命令
nohup java -jar cpu-over-test-1.0.jar  &


啓動成功示例:
在這裏插入圖片描述
啓動成功後,幾秒功夫就看到cpu 百分之百了

4.問題排查四步驟

4.1.查看佔用CPU高的進程

top

如下圖:整體CPU高達96.3%
可看出PID爲 14855 的java進程佔用cpu最高,達到了92.3%
在這裏插入圖片描述

4.2.查看進程中最耗CPU的子線程

使用命令:top -p 進程pid -H

top -p 14855 -H

如下圖:可看出PID爲14856的線程佔用cpu最高,達到了92.3%
在這裏插入圖片描述

4.3最耗CPU的線程id轉換爲16進制

使用命令:printf “%x \n” 線程PID

 printf "%x \n" 14856

在這裏插入圖片描述

4.4查看具體出現問題的代碼位置

使用命令:jstack 進程pid | grep 線程ID轉換爲16進制值 -C20

jstack 14855 | grep 3a08 -C20

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章