CPU的load和使用率傻傻分不清
1. 什么是Cpu的Load
查看方式:
uptime
top
cat /proc/loadavg
平均負載LOAD AVERAGE是指單位時間內(nèi)铛嘱,系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)嗡午,也就是平均活躍進程數(shù)熊经,它和 CPU 使用率并沒有直接關(guān)系呕诉。(可運行分為正在運行進程和正在等待CPU的進程,狀態(tài)為R保礼;不可中斷則是它正在做某些工作不能被中斷比如等待磁盤IO等沛励,其狀態(tài)為D)责语,它是從另外一個角度體現(xiàn)CPU的使用狀態(tài)。
如何理解LOAD這個含義呢侯勉?
上圖1個電話亭可以理解為一個CPU核心鹦筹。從上圖的過程中可以看到load的概念,而使用率始終100%址貌。
理想的CPU load是多少
這個跟你的CPU核心數(shù)量有關(guān)铐拐,理想情況下一個核心被一個進程占用,如果你是4個核心练对,那么跑4個進程遍蟋,此時Load是4但是也不高,如果你只有2個核心螟凭,依然跑4個進程虚青,這就意味著有一半進程在某一個時刻搶不到CPU,這時候Load還是4螺男,如果是短期狀態(tài)還無所謂棒厘,如果長期是這個狀態(tài)你就要注意了。一般高于cpu數(shù)量70%的時候下隧,就需要排查負載高的問題奢人。
多核心CPU和多處理器
對于性能而言一個雙核CPU和2個單核CPU是差不多的,當(dāng)然一些細小區(qū)別是CPU的緩存淆院、進程可能會在多個CPU上切換等。除了這些對于LOAD而言支救,核心個數(shù)才是最重要的拷淘,有多少個物理處理器不重要。
對于一個4核心處理器的系統(tǒng)來說启涯,一個LOAD為3.00依然很健康贬堵,因為LOAD相對于處理器的核心數(shù)來說,100%使用率在一個單核處理器上的load是1.00逝嚎,那么在一個雙核處理器上就是2.00,在一個4核心處理器上就是4.00详恼。
所以對于有多核心CPU的系統(tǒng)來說最大LOAD是最大的核心數(shù)量补君。2CPU、每個CPU有6個物理核心昧互、算上超線程最終的邏輯CPU個數(shù)是24個挽铁。比如在Linux查看如下:
這里一個processor就算一個核心伟桅,雖然這里的數(shù)量是通過因特爾的超線程模擬出來的
應(yīng)該關(guān)注哪個值
應(yīng)該關(guān)注5分鐘或者15分鐘,因為CPU偶爾高一些比較正常叽掘,但是如果最近15分鐘都很高就需要調(diào)查了楣铁。
查看Linux系統(tǒng)物理CPU個數(shù)、核心數(shù)和邏輯CPU個數(shù)
總核數(shù) = 物理CPU個數(shù) * 每個物理CPU的核心數(shù)
總邏輯CPU數(shù) = 物理CPU個數(shù) * 每個物理CPU的核心數(shù) * 超線程數(shù)量
# 查看物理CPU個數(shù)
cat
/proc/cpuinfo``| ``grep
"physical id"``| ``sort``| ``uniq``| ``wc
-l
查看每個物理CPU中的核心數(shù)
cat
/proc/cpuinfo``| ``grep
"cpu cores"``| ``uniq
查看邏輯CPU的個數(shù)
cat
/proc/cpuinfo``| ``grep
"processor"``| ``wc
-l
2. 什么是CPU使用率
使用率這個要結(jié)合時間片來說更扁,從上圖的演變可以看出影響使用率高低的因素不是LOAD的多少盖腕,而是在分配給某個進程時間片時,這個進程是否使用了CPU的計算能力浓镜。
在第四分鐘時候溃列,分配給藍人1分鐘,但是它什么也沒干膛薛,這1分鐘內(nèi)電話是閑置的沒有被使用听隐,所以這一分鐘內(nèi)的電話使用率就是0%。但是LOAD是3哄啄。
當(dāng)然這里就存在一個統(tǒng)計周期的問題咨跌,上圖我們的統(tǒng)計周期是1分鐘虑润,而分配給每個人的最小時間單位也是1分鐘拳喻。從計算機角度來說冗澈,單核心CPU彻采,假設(shè)1秒鐘分為100個時間片肛响,如果2個任務(wù)特笋,第一個任務(wù)用了5個時間片執(zhí)行完成猎物,另外一個任務(wù)用了15個時間片執(zhí)行完成蔫磨,所以如果統(tǒng)計周期是1秒堤如,那么這1秒內(nèi)的CPU使用率就是20%嫉嘀。CPU利用率高不一定負載高剪侮。利用率是一段時間內(nèi)CPU被占用的情況瓣俯。
CPU負載高利用率低:說明等待執(zhí)行的任務(wù)很多彩匕,但是通常任務(wù)多CPU使用率也會比較高驼仪,如果低就說明CPU根本沒工作绪爸,哪些很多的任務(wù)處于等待狀態(tài),可能進程僵死了座掘∑妓洌可以通過命令ps –axjf查看是否存在D狀態(tài)的進程杉编,該狀態(tài)時不可中斷的睡眠狀態(tài)王财。這種狀態(tài)無法被KILL。而有時候你通過top命令也看不出來偿衰,只能顯示LOAD高缤言,但是沒有哪個進程的CPU使用率明顯高纱意,你可以通過ps –ux來查看。
CPU利用率高負載低:說明任務(wù)少虏辫,但是任務(wù)執(zhí)行時間長羹唠,有可能是程序本身有問題佩微,如果沒有問題那么計算完成后則利用率會下降喊衫。
3. CPU多核心和多線程
CPU的組成是由控制器(Control Unit 負責(zé)調(diào)度)和運算器(Processing Unit 運算處理單元)組成。
單核CPU:一個分配工作的寝杖、一個具體干活的瑟幕,來了一個任務(wù)那么先有控制器進行進行調(diào)度辣往,如果此時運算器空閑那么就直接由運算器進行處理,如果此時運算器正在處理其他任務(wù)那么這個后來的任務(wù)就需要等待许起。
多核CPU:就是每個核心都有一組控制器和運算器园细。比如I5是4核心猛频,簡單來說他可以并行處理四個任務(wù)。假設(shè)這時候同時來了8個任務(wù)烈和,那么分配到四個核心上相當(dāng)于4個隊列招刹,此時每個隊列只有2個任務(wù)。相比單核心CPU執(zhí)行效率會大大提高妇拯。
什么是超線程
超線程(HT):超線程和多線程不同越锈,多線程是程序方面的屬于軟的代碼級別的,超線程是硬件架構(gòu)方面的丹弱,通過控制器來模擬邏輯核心躲胳。
超線程有什么作用蝠咆?其實也是為了提高效率更高的榨干控制器的運行能力。為什么這么說呢再芋,因為任務(wù)過來之后很多時候不是馬上就能由運算器進行計算的,它還需要其他資源比如網(wǎng)絡(luò)傳輸過來的數(shù)據(jù)或者是硬盤中的數(shù)據(jù)司训,那么此時運算器就閑著壳猜,為了更大限度利用運算器统扳,我可以設(shè)置2個控制器對應(yīng)一個運算器,其中一個控制器處理的程序需要等待數(shù)據(jù)的時候朱嘴,如果另外一個控制器處理的程序不需要等待或者數(shù)據(jù)已經(jīng)準備好,那么就可以立即發(fā)送給運算器進行計算帚湘。
下圖藍色和橙色都是CPU的運算器在工作大诸,白色表示運算器空閑焙贷。A圖是單核心辙芍、B圖是雙核心故硅、C圖是單核心啟用超線程,可以看到C圖的CPU利用率最大徘层。
多線程有什么缺點
爭搶:核心上運算器只有一個,但是控制器2個跷敬,如果來的一個任務(wù)那么這兩個控制器就需要協(xié)調(diào)一下誰來處理,所以這個會有一定損耗池凄。這就相當(dāng)于線程池中的驚群概念肿仑。
發(fā)生擁擠:物理核心太多如果開啟HT則邏輯核心增加一倍,如果這時候來了幾百個任務(wù)伟端,如何分配這些任務(wù)到哪些核心上就是個問題责蝠,雖然這是由操作系統(tǒng)來做的調(diào)度但是也會有額外損耗齿拂,相反你只有一個我就根本不需要考慮分配的問題署海。
4. 一次問題排查
查看隊列長度镀梭,r表示運行和等待CPU時間片的進程數(shù)量丰辣;b表示等待資源的進程數(shù)量比如IO、或者內(nèi)存交互等琐凭。
查看進程中哪個線程使用率高
根據(jù)線程來查看具體代碼愁憔。
你也可以直接殺死這個進程吨掌。我這里直接殺死膜宋,然后LOAD就下降了。