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


1. 什么是Cpu的Load


查看方式:
uptime
top
cat /proc/loadavg
平均負(fù)載LOAD AVERAGE是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù),它和 CPU 使用率并沒有直接關(guān)系。(可運(yùn)行分為正在運(yùn)行進(jìn)程和正在等待CPU的進(jìn)程,狀態(tài)為R;不可中斷則是它正在做某些工作不能被中斷比如等待磁盤IO等,其狀態(tài)為D),它是從另外一個(gè)角度體現(xiàn)CPU的使用狀態(tài)。
如何理解LOAD這個(gè)含義呢?

上圖1個(gè)電話亭可以理解為一個(gè)CPU核心。從上圖的過程中可以看到load的概念,而使用率始終100%。
理想的CPU load是多少
這個(gè)跟你的CPU核心數(shù)量有關(guān),理想情況下一個(gè)核心被一個(gè)進(jìn)程占用,如果你是4個(gè)核心,那么跑4個(gè)進(jìn)程,此時(shí)Load是4但是也不高,如果你只有2個(gè)核心,依然跑4個(gè)進(jìn)程,這就意味著有一半進(jìn)程在某一個(gè)時(shí)刻搶不到CPU,這時(shí)候Load還是4,如果是短期狀態(tài)還無所謂,如果長(zhǎng)期是這個(gè)狀態(tài)你就要注意了。一般高于cpu數(shù)量70%的時(shí)候,就需要排查負(fù)載高的問題。
多核心CPU和多處理器
對(duì)于性能而言一個(gè)雙核CPU和2個(gè)單核CPU是差不多的,當(dāng)然一些細(xì)小區(qū)別是CPU的緩存、進(jìn)程可能會(huì)在多個(gè)CPU上切換等。除了這些對(duì)于LOAD而言,核心個(gè)數(shù)才是最重要的,有多少個(gè)物理處理器不重要。
對(duì)于一個(gè)4核心處理器的系統(tǒng)來說,一個(gè)LOAD為3.00依然很健康,因?yàn)長(zhǎng)OAD相對(duì)于處理器的核心數(shù)來說,100%使用率在一個(gè)單核處理器上的load是1.00,那么在一個(gè)雙核處理器上就是2.00,在一個(gè)4核心處理器上就是4.00。
所以對(duì)于有多核心CPU的系統(tǒng)來說最大LOAD是最大的核心數(shù)量。2CPU、每個(gè)CPU有6個(gè)物理核心、算上超線程最終的邏輯CPU個(gè)數(shù)是24個(gè)。比如在Linux查看如下:

這里一個(gè)processor就算一個(gè)核心,雖然這里的數(shù)量是通過因特爾的超線程模擬出來的
應(yīng)該關(guān)注哪個(gè)值

應(yīng)該關(guān)注5分鐘或者15分鐘,因?yàn)镃PU偶爾高一些比較正常,但是如果最近15分鐘都很高就需要調(diào)查了。
查看Linux系統(tǒng)物理CPU個(gè)數(shù)、核心數(shù)和邏輯CPU個(gè)數(shù)
總核數(shù) = 物理CPU個(gè)數(shù) * 每個(gè)物理CPU的核心數(shù)
總邏輯CPU數(shù) = 物理CPU個(gè)數(shù) * 每個(gè)物理CPU的核心數(shù) * 超線程數(shù)量
# 查看物理CPU個(gè)數(shù)
cat /proc/cpuinfo``| ``grep "physical id"``| ``sort``| ``uniq``| ``wc -l

查看每個(gè)物理CPU中的核心數(shù)
cat /proc/cpuinfo``| ``grep "cpu cores"``| ``uniq

查看邏輯CPU的個(gè)數(shù)
cat /proc/cpuinfo``| ``grep "processor"``| ``wc -l

2. 什么是CPU使用率

使用率這個(gè)要結(jié)合時(shí)間片來說,從上圖的演變可以看出影響使用率高低的因素不是LOAD的多少,而是在分配給某個(gè)進(jìn)程時(shí)間片時(shí),這個(gè)進(jìn)程是否使用了CPU的計(jì)算能力。
在第四分鐘時(shí)候,分配給藍(lán)人1分鐘,但是它什么也沒干,這1分鐘內(nèi)電話是閑置的沒有被使用,所以這一分鐘內(nèi)的電話使用率就是0%。但是LOAD是3。
當(dāng)然這里就存在一個(gè)統(tǒng)計(jì)周期的問題,上圖我們的統(tǒng)計(jì)周期是1分鐘,而分配給每個(gè)人的最小時(shí)間單位也是1分鐘。從計(jì)算機(jī)角度來說,單核心CPU,假設(shè)1秒鐘分為100個(gè)時(shí)間片,如果2個(gè)任務(wù),第一個(gè)任務(wù)用了5個(gè)時(shí)間片執(zhí)行完成,另外一個(gè)任務(wù)用了15個(gè)時(shí)間片執(zhí)行完成,所以如果統(tǒng)計(jì)周期是1秒,那么這1秒內(nèi)的CPU使用率就是20%。CPU利用率高不一定負(fù)載高。利用率是一段時(shí)間內(nèi)CPU被占用的情況。
CPU負(fù)載高利用率低:說明等待執(zhí)行的任務(wù)很多,但是通常任務(wù)多CPU使用率也會(huì)比較高,如果低就說明CPU根本沒工作,哪些很多的任務(wù)處于等待狀態(tài),可能進(jìn)程僵死了。可以通過命令ps –axjf查看是否存在D狀態(tài)的進(jìn)程,該狀態(tài)時(shí)不可中斷的睡眠狀態(tài)。這種狀態(tài)無法被KILL。而有時(shí)候你通過top命令也看不出來,只能顯示LOAD高,但是沒有哪個(gè)進(jìn)程的CPU使用率明顯高,你可以通過ps –ux來查看。
CPU利用率高負(fù)載低:說明任務(wù)少,但是任務(wù)執(zhí)行時(shí)間長(zhǎng),有可能是程序本身有問題,如果沒有問題那么計(jì)算完成后則利用率會(huì)下降。
3. CPU多核心和多線程
CPU的組成是由控制器(Control Unit 負(fù)責(zé)調(diào)度)和運(yùn)算器(Processing Unit 運(yùn)算處理單元)組成。
單核CPU:一個(gè)分配工作的、一個(gè)具體干活的,來了一個(gè)任務(wù)那么先有控制器進(jìn)行進(jìn)行調(diào)度,如果此時(shí)運(yùn)算器空閑那么就直接由運(yùn)算器進(jìn)行處理,如果此時(shí)運(yùn)算器正在處理其他任務(wù)那么這個(gè)后來的任務(wù)就需要等待。
多核CPU:就是每個(gè)核心都有一組控制器和運(yùn)算器。比如I5是4核心,簡(jiǎn)單來說他可以并行處理四個(gè)任務(wù)。假設(shè)這時(shí)候同時(shí)來了8個(gè)任務(wù),那么分配到四個(gè)核心上相當(dāng)于4個(gè)隊(duì)列,此時(shí)每個(gè)隊(duì)列只有2個(gè)任務(wù)。相比單核心CPU執(zhí)行效率會(huì)大大提高。
什么是超線程
超線程(HT):超線程和多線程不同,多線程是程序方面的屬于軟的代碼級(jí)別的,超線程是硬件架構(gòu)方面的,通過控制器來模擬邏輯核心。
超線程有什么作用?其實(shí)也是為了提高效率更高的榨干控制器的運(yùn)行能力。為什么這么說呢,因?yàn)槿蝿?wù)過來之后很多時(shí)候不是馬上就能由運(yùn)算器進(jìn)行計(jì)算的,它還需要其他資源比如網(wǎng)絡(luò)傳輸過來的數(shù)據(jù)或者是硬盤中的數(shù)據(jù),那么此時(shí)運(yùn)算器就閑著,為了更大限度利用運(yùn)算器,我可以設(shè)置2個(gè)控制器對(duì)應(yīng)一個(gè)運(yùn)算器,其中一個(gè)控制器處理的程序需要等待數(shù)據(jù)的時(shí)候,如果另外一個(gè)控制器處理的程序不需要等待或者數(shù)據(jù)已經(jīng)準(zhǔn)備好,那么就可以立即發(fā)送給運(yùn)算器進(jìn)行計(jì)算。
下圖藍(lán)色和橙色都是CPU的運(yùn)算器在工作,白色表示運(yùn)算器空閑。A圖是單核心、B圖是雙核心、C圖是單核心啟用超線程,可以看到C圖的CPU利用率最大。


多線程有什么缺點(diǎn)
爭(zhēng)搶:核心上運(yùn)算器只有一個(gè),但是控制器2個(gè),如果來的一個(gè)任務(wù)那么這兩個(gè)控制器就需要協(xié)調(diào)一下誰來處理,所以這個(gè)會(huì)有一定損耗。這就相當(dāng)于線程池中的驚群概念。
發(fā)生擁擠:物理核心太多如果開啟HT則邏輯核心增加一倍,如果這時(shí)候來了幾百個(gè)任務(wù),如何分配這些任務(wù)到哪些核心上就是個(gè)問題,雖然這是由操作系統(tǒng)來做的調(diào)度但是也會(huì)有額外損耗,相反你只有一個(gè)我就根本不需要考慮分配的問題。
4. 一次問題排查

查看隊(duì)列長(zhǎng)度,r表示運(yùn)行和等待CPU時(shí)間片的進(jìn)程數(shù)量;b表示等待資源的進(jìn)程數(shù)量比如IO、或者內(nèi)存交互等。


查看進(jìn)程中哪個(gè)線程使用率高

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