1. 程式人生 > >cpu資訊獲取

cpu資訊獲取

  • 準備知識

    1. /proc檔案系統是一個偽檔案系統,該檔案系統中儲存著核心控制相關資訊,通俗點說就是這個目錄是虛擬的,它受核心直接控制,儲存與核心控制相關的資料,與其他目錄不同的是/proc目錄不是真實儲存在硬碟中的,它的資料儲存在記憶體中,但是由於它和其他目錄一樣把自己註冊到虛擬檔案系統層了,所以我們還是能看到這個目錄相關資訊,然而只有虛擬檔案系統層呼叫它的時候,他才會建立相關檔案和目錄並與核心溝通獲取相關資訊。

    2. 上面我們說道/proc 檔案系統儲存著核心控制相關資訊的目錄,該目錄下的/proc/stat檔案儲存的是CPU相關資訊,我們想要獲取CPU

      相關資訊最直接和最快速的方式就是讀取該檔案,其實Linux下很多的工具都是讀取的這個檔案。在這個檔案中包含了所有的CPU活動資訊,並且該檔案中所有值都是從系統啟動算起直到訪問檔案的這一刻的資料。如下就是某一刻/proc/stat檔案中的資料:

      cpu  499312 1086 227835 10498412 3803 0 10904 0 0 0
      cpu0 125361 278 56675 2626355 450 0 2242 0 0 0
      cpu1 124704 288 57768 2627741 350 0 2168 0 0 0
      cpu2 130284 261 55543 2620559 2442 0 1762 0 0 0
      cpu3 118961 258 57848 2623755 560 0 4731 0 0 0
      intr 46393945 9 924 0 0 0 0 0 0 1 14751 0 0 215 0 0 0 139800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4476 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 408029 0 283839 7963609 40 945 1535489 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      ctxt 124171702
      btime 1539737966
      processes 626819
      procs_running 4
      procs_blocked 0
      softirq 27922585 9163685 6158929 26 485 278010 0 160301 6495615 0 5665534
      

      資料單位:jiffies

      • 如上資料中從cpu到cpu3五行(從左到右按順序)每一列的含義如下:

        1. user:如上499312125361124704等,使用者態時間。
        2. nice:如上1086等第二列資料,nice值為負數的程序所佔時間。
        3. system:如上第三列資料,核心時間。
        4. idle:如上第四列資料,除硬碟IO等待時間之外的時間。
        5. iowait:如上第五列資料,硬碟IO等待時間。
        6. irq:如上第六列資料,硬中斷時間。
        7. softirq如上第七列資料,軟中斷時間。

        C P U t i m e = u s e r l i n e : 1 + n i c e l i n e : 2 + s y s t e m l i n e : 3 + i d l e l i n e : 4 + i o w a i t l i n e : 5 + i r q l i n e : 6 + s o r t i r q l i n e : 7 CPU_{time}=user_{line:1} +nice_{line:2} + system_{line:3} + idle_{line:4} + iowait_{line:5} + irq_{line:6} + sortirq_{line:7}

      • 剩下的幾行:

        1. initr:中斷次數
        2. ctxt:交換次數
        3. btime:從系統啟動到訪問檔案為止的時間。
        4. processes:任務數。
        5. procs_runing:當前執行佇列的任務數。
        6. procs_blocked:當前被阻塞的任務數。
      • CPU利用率計算可以採用兩點取樣取差值的方式:

        C P U u s a g e = ( i d l e i d l e ) / ( C P U t i m e C P U t i m e ) 100 CPU_{usage} = (idle_{第二次取樣} - idle_{第一次取樣}) / (CPU_{time第二次取樣} - CPU_{time第一次取樣}) * 100

    3. CPU溫度的獲取:

      cpu溫度儲存在/sys/class/thermal/thermal_zone0/temp中,讀取出的數值需要除以1000。

    4. bash 工具:

      1. cat:工具用來強制讀取一個檔案。
      2. gerp:工具用來篩選資料。
      3. awk:用來處理資料。
      4. uptime:獲取cpu負載資訊
    5. bash 數值計算:

      bash中的數值計算比較方便的方式是雙小括號:

      num=0
      ((num++)) # 在雙小括號中可以正常使用C語言的數值計算語法
      echo ${num}
      
      ---------------
      1