理解Linux 的CPU Load和CPU利用率


 

 

1. 什么是Cpu的Load

 

圖1:

 

 

圖2:

 

圖3:

 

 

 

圖4:

 

 

 

使用uptime、top或者查看/proc/loadavg都可以看到CPU的load統計,這里有三個值,分別代表1分鍾、5分鍾和15分鍾的CPU Load情況。大部分人認為這三個數值越小說明比較好,如果越高說明系統可能存在問題或負載過高了。那這個值處於什么狀態是好什么又是不好?什么時候需要關注並檢查高的原因?
LOAD AVERAGE:一段時間內處於可運行狀態和不可中斷狀態的進程平均數量。(可運行分為正在運行進程和正在等待CPU的進程,狀態為R;不可中斷則是它正在做某些工作不能被中斷比如等待磁盤IO等,其狀態為D),它是從另外一個角度體現CPU的使用狀態。
如何理解LOAD這個含義呢?

 

 

 

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

理想的CPU load是多少

這個跟你的CPU核心數量有關,理想情況下一個核心被一個進程占用,如果你是4個核心,那么跑4個進程,此時Load是4但是也不高,如果你只有2個核心,依然跑4個進程,這就意味着有一半進程在某一個時刻搶不到CPU,這時候Load還是4,如果是短期狀態還無所謂,如果長期是這個狀態你就要注意了。

 

首先,我們從最簡單的單核處理器的系統進行說明。

CPU負載有點類似於交通擁堵程度

單核CPU就像一條單行道。想象您是一名交警.有時這條單行道太忙了,有汽車在排隊等待同行。想讓人們知道這條路的交通如何。最直接的指標是就是在特定時間內,這條道路上等待多少輛汽車。如果沒有汽車在等待,即將到來的駕駛員便知道他們可以馬上駛過。如果有汽車在排隊等候,則駕駛員就知道知道要耽誤時間了。

所以,交警同志,你應該怎樣去定義交通擁塞程度的?可以按照下面的規則:

    0.00表示路上根本沒有車。實際上,介於0.00和1.00之間都表示沒有交通擁堵,到達的汽車可以直接同行。
    1.00表示道路完全處於滿負荷狀態。一切都還不錯,但是如果再增加一輛汽車,將會產生交通堵塞。
    超過1.00表示有交通堵塞。2.00意味着當前的汽車總量需要兩條車道才能保證不堵塞。 3.00意味着當前的汽車總量需要三條車道才能保證不堵塞。

 

如圖:

 

 

這基本上就是CPU負載的含義。 “汽車”是指使用CPU時間(“通行”)或排隊使用CPU的進程。 Unix將CPU負載定義為運行隊列的長度:當前正在運行的進程數與正在等待(排隊)的進程數之和。

就像交警一樣,您希望您的汽車/進程永遠不會等待。因此,理想情況下,您的CPU負載應保持在1.00以下。如果系統的負載暫時獲得高於1.00的峰值,還是可以的,但是負載您始終高於1.00時,則需要進行處理了。


CPU load的理想值是1.0?

其實不然,當CPU的 load為1.00的時候,你的系統處於滿負荷運轉,再來一個進程,就會高於1.00,你的系統的性能將會降低,所以系統沒有流出余糧,實際工作中,很多系統管理員認為比較理想的CPU負載應該是0.7,因此我們針對線上CPU負載的處理規則如下:

    0.70:需要注意並排查原因 。 如果平均負載保持在> 0.70以上,那么應該在情況變得更糟之前進行調查。

    1.00: 不緊急,需要處理。如果平均負載保持在1.00以上,需要查找問題原因並立即解決。否則,你的服務器可能在任何時候出現性能問題。

    5.0:緊急狀態,立即處理。如果平均負載高於5.00,那么你的系統馬上就要崩潰了,很有可能系統掛機或者hang死。因此需要立即處理這種情況,千萬不要讓你的系統負載達到5!

 



 

 

 

 

多核心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就算一個核心,雖然這里的數量是通過因特爾的超線程模擬出來的

 

出於性能目的,具有單個雙核處理器的計算機是否基本上等同於具有兩個具有一個內核的處理器的計算機?是的。大致上是一樣的。但是還有很多其他微妙之,例如:高速緩存的數量,處理器之間的進程切換頻率等。盡管多處理器有這些優點,但為了對於CPU負載值來說,CPU Core的總數是很重要的,因為無論怎樣CPU Core是物理隔離的。

因此我們需要添加兩條新的CPU 負載處理規則:

“核數=最大負載”:在多核系統上,您的負載不應超過可用核數。

“Core就是Core”的經驗法則:CPU Core的性能與CPU上的分布方式無關。兩個四核==四個雙核==八個單核。他們的性能與八個Core的性能等同。

 

 

應該關注哪個值

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

查看Linux系統物理CPU個數、核心數和邏輯CPU個數

總核數 = 物理CPU個數 * 每個物理CPU的核心數
總邏輯CPU數 = 物理CPU個數 * 每個物理CPU的核心數 * 超線程數量

 

# 查看物理CPU個數
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

 

如圖:

 

 

 

查看每個物理CPU中的核心數
cat /proc/cpuinfo| grep "cpu cores"| uniq

 

 

 

查看邏輯CPU的個數
cat /proc/cpuinfo| grep "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:

 

 

 

多線程有什么缺點

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

 

 

4. 一次問題排查

 

如圖:

 

 

查看隊列長度,r表示運行和等待CPU時間片的進程數量;b表示等待資源的進程數量比如IO、或者內存交互等。

 

 

圖2 :

 

 

查看進程中哪個線程使用率高

 

 

 

根據線程來查看具體代碼。
你也可以直接殺死這個進程。我這里直接殺死,然后LOAD就下降了。

 

 

 

參考:

https://www.cnblogs.com/rexcheny/p/9382396.html

https://www.jianshu.com/p/dde394a143e5

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM