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的核心數 * 超線程數量
# 查看物理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個,如果來的一個任務那么這兩個控制器就需要協調一下誰來處理,所以這個會有一定損耗。這就相當於線程池中的驚群概念。
發生擁擠:物理核心太多如果開啟HT則邏輯核心增加一倍,如果這時候來了幾百個任務,如何分配這些任務到哪些核心上就是個問題,雖然這是由操作系統來做的調度但是也會有額外損耗,相反你只有一個我就根本不需要考慮分配的問題。
4. 一次問題排查
查看隊列長度,r表示運行和等待CPU時間片的進程數量;b表示等待資源的進程數量比如IO、或者內存交互等。
查看進程中哪個線程使用率高
根據線程來查看具體代碼。
你也可以直接殺死這個進程。我這里直接殺死,然后LOAD就下降了。