CPU的load和使用率傻傻分不清

1. 什麼是Cpu的Load

使用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和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就下降了。

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