CPU佔用過高如何定位分析

在實際開發過程中,我們經常遇到cup突然飆升,這個時候我們要怎麼分析,是項目中的那一行代碼導致的呢?

假如有下面一段程序

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @Author: wu.yj
 * @Description:
 * @Date: 2020/3/24 9:44
 */
public class TestCpu {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        int count = 0;
        while (true) {
            double random = Math.random();
            list.add((int) random * 1000000);
            System.out.println(++ count);
        }
    }
}

這段程序我們在linux中運行,會不斷的打印一串串的數字,這個時候cpu的使用一直飆升,下面我們講一下如何分析:

1、先使用top命令;

首先看下用紅色圈圈標記的分別是啥含義:

linux系統當前時間

從開機到目前運行了多久,

當前有幾個用戶連接到本臺主機

負載均衡,當三個值(這三個值分別爲:1分鐘平均負載、5分鐘平均負載、15 分鐘平均負載)相加後除以3結果大於0.6表示需要注意服務器負擔。

Cpu使用率

80.6%id,該idsystem idle process=處理器空閒時間百分比,越大越好

Swap,交換分區的值

由上圖可知,java程序佔用cpu過高的進程是10908

2、進一步定位到具體的線程和代碼

使用:ps -mp 進程號 -o THREAD,tid,time

以上命令參數解釋:

-m 顯示所有的線程

-p pid 進程使用cpu的時間

-o 該參數後是用戶自定義的格式

從上面可以得出,是由於線程id 爲10909(轉化爲十六進制小寫)的線程導致cup佔用過高;

3、查看具體的代碼,使用 jstack 進程ID | grep tid(十六進制線程ID小寫英文) -A80

從上圖我們就知道導致cup過高是由於TestCup這個類中19行代碼導致的;

 

 

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