1. 程式人生 > >圖解cpu load和cpu使用率

圖解cpu load和cpu使用率

最近在做一個性能提升的專案,方案改進前後需要關注cpu相關的一些指標,之前對於cpu load和cpu使用率的概念分的不是太清楚,看了這篇部落格之後感覺挺有意思的,轉給有需要的同學 。

目錄

1. 什麼是Cpu的Load

理想的CPU load是多少

多核心CPU和多處理器

應該關注哪個值

檢視Linux系統物理CPU個數、核心數和邏輯CPU個數

2. 什麼是CPU使用率

3. CPU多核心和多執行緒

什麼是超執行緒

多執行緒有什麼缺點

4. 一次問題排查


 

1. 什麼是Cpu的Load

使用uptime、top或者檢視/proc/loadavg都可以看到CPU的load統計,這裡有三個值,分別代表1分鐘、5分鐘和15分鐘的CPU Load情況。大部分人認為這三個數值越小說明比較好,如果越高說明系統可能存在問題或負載過高了。那這個值處於什麼狀態是好什麼又是不好?什麼時候需要關注並檢查高的原因?
LOAD AVERAGE:一段時間內CPU正在處理和等待處理的程序總和,它是從另外一個角度體現CPU的使用狀態。
如何理解LOAD這個含義呢?

上圖1個電話亭可以理解為一個CPU核心。從上圖的過程中可以看到load的概念,而使用率始終100%。

理想的CPU load是多少

一定不是1。小於1就好嗎?如果你的LOAD小於1但是一直大於0.70則你就需要注意一下,看看是不是有什麼隱患。
如果則長期是1或者大於1,則需要儘快修復。
不過上面是基於單CPU單核心來說的。

多核心CPU和多處理器

對於效能而言一個雙核CPU和2個單核CPU是差不多的,當然一些細小區別是CPU的快取、程序可能會在多個CPU上切換等。除了這些對於LOAD而言,核心個數才是最重要的,有多少個物理處理器不重要。
對於一個4核心處理器的系統來說,一個LOAD為3.00依然很健康,因為LOAD相對於處理器的核心數來說,100%使用率在一個單核處理器上的load是1.00,那麼在一個雙核處理器上就是2.00,在一個4核心處理器上就是4.00。
回到橋的那個例子,如果橋只有1條車到那麼LOAD是1.00表示橋達到最大承載能力,如果在一個有2條車道的橋上1.00表示橋的負載啊是50%,1條車道滿了,另外一條空閒可以繼續通行。
所以對於有多核心CPU的系統來說最大LOAD是最大的核心數量,你的LOAD不應該超過最大核心數量。2CPU、每個CPU有6個物理核心、算上超執行緒最終的邏輯CPU個數是24個。比如在Linux檢視如下:

這裡一個processor就算一個核心,雖然這裡的數量是通過因特爾的超執行緒模擬出來的

應該關注哪個值

應該關注5分鐘或者15分鐘,因為CPU偶爾高一些比較正常,但是如果最近15分鐘都很高就需要調查了。

檢視Linux系統物理CPU個數、核心數和邏輯CPU個數

總核數 = 物理CPU個數 * 每個物理CPU的核心數
總邏輯CPU數 = 物理CPU個數 * 每個物理CPU的核心數 * 超執行緒數量

1

2

# 檢視物理CPU個數

cat /proc/cpuinfogrep "physical id"

sortuniqwc -l

1

2

檢視每個物理CPU中的核心數

cat /proc/cpuinfogrep "cpu cores"uniq

1

2

檢視邏輯CPU的個數

cat /proc/cpuinfogrep "processor"wc -l

2. 什麼是CPU使用率

使用率這個要結合時間片來說,從上圖的演變可以看出影響使用率高低的因素不是LOAD的多少,而是在分配給某個程序時間片時,這個程序是否使用了CPU的計算能力。
在第四分鐘時候,分配給藍人1分鐘,但是它什麼也沒幹,這1分鐘內電話是閒置的沒有被使用,所以這一分鐘內的電話使用率就是0%。但是LOAD是3。
當然這裡就存在一個統計週期的問題,上圖我們的統計週期是1分鐘,而分配給每個人的最小時間單位也是1分鐘。從計算機角度來說,單核心CPU,假設1秒鐘分為100個時間片,如果2個任務,第一個任務用了5個時間片執行完成,另外一個任務用了15個時間片執行完成,所以如果統計週期是1秒,那麼這1秒內的CPU使用率就是20%。CPU利用率高不一定負載高。利用率是一段時間內CPU被佔用的情況。
CPU負載高利用率低:說明等待執行的任務很多,但是通常任務多CPU使用率也會比較高,如果低就說明CPU根本沒工作,哪些很多的任務處於等待狀態,可能程序僵死了。可以通過命令ps –axjf檢視是否存在D狀態的程序,該狀態時不可中斷的睡眠狀態。這種狀態無法被KILL。而有時候你通過top命令也看不出來,只能顯示LOAD高,但是沒有哪個程序的CPU使用率明顯高,你可以通過ps –ux來檢視。
CPU利用率高負載低:說明任務少,但是任務執行時間長,有可能是程式本身有問題,如果沒有問題那麼計算完成後則利用率會下降。

3. CPU多核心和多執行緒

CPU的組成是由控制器(Control Unit 負責排程)和運算器(Processing Unit 運算處理單元)組成。
單核CPU:一個分配工作的、一個具體幹活的,來了一個任務那麼先有控制器進行進行排程,如果此時運算器空閒那麼就直接由運算器進行處理,如果此時運算器正在處理其他任務那麼這個後來的任務就需要等待。
多核CPU:就是每個核心都有一組控制器和運算器。比如I5是4核心,簡單來說他可以並行處理四個任務。假設這時候同時來了8個任務,那麼分配到四個核心上相當於4個佇列,此時每個佇列只有2個任務。相比單核心CPU執行效率會大大提高。

什麼是超執行緒

超執行緒(HT):超執行緒和多執行緒不同,多執行緒是程式方面的屬於軟的程式碼級別的,超執行緒是硬體架構方面的,通過控制器來模擬邏輯核心。
超執行緒有什麼作用?其實也是為了提高效率更高的榨乾控制器的執行能力。為什麼這麼說呢,因為任務過來之後很多時候不是馬上就能由運算器進行計算的,它還需要其他資源比如網路傳輸過來的資料或者是硬碟中的資料,那麼此時運算器就閒著,為了更大限度利用運算器,我可以設定2個控制器對應一個運算器,其中一個控制器處理的程式需要等待資料的時候,如果另外一個控制器處理的程式不需要等待或者資料已經準備好,那麼就可以立即傳送給運算器進行計算。
下圖藍色和橙色都是CPU的運算器在工作,白色表示運算器空閒。A圖是單核心、B圖是雙核心、C圖是單核心啟用超執行緒,可以看到C圖的CPU利用率最大。

多執行緒有什麼缺點

爭搶:核心上運算器只有一個,但是控制器2個,如果來的一個任務那麼這兩個控制器就需要協調一下誰來處理,所以這個會有一定損耗。這就相當於執行緒池中的驚群概念。
發生擁擠:物理核心太多如果開啟HT則邏輯核心增加一倍,如果這時候來了幾百個任務,如何分配這些任務到哪些核心上就是個問題,雖然這是由作業系統來做的排程但是也會有額外損耗,相反你只有一個我就根本不需要考慮分配的問題。

4. 一次問題排查

檢視佇列長度,r表示執行和等待CPU時間片的程序數量;b表示等待資源的程序數量比如IO、或者記憶體互動等。

檢視程序中哪個執行緒使用率高

根據執行緒來檢視具體程式碼。
你也可以直接殺死這個程序。我這裡直接殺死,然後LOAD就下降了。

轉自原文地址:https://www.cnblogs.com/yunxizhujing/p/9382396.html