如何理解和分析linux系统的CPU平均负载情况(load average)
最近研究linux時接觸到了一個新的概念,叫做CPU的平均負載(load average)。之前都只聽說過CPU的使用情況,很少聽說過負載情況。于是對這個概念進行了一下研究學習,總結如下,以便日后查閱。
一、如何理解CPU負載情況
CPU負載情況定義為在特定時間間隔內運行隊列中的進程數量的平均值,換句話說就是該段時間內正在使用和等待使用CPU的平均任務數。CPU的負載越大,代表CPU必須要在不同的工作之間進行頻繁的工作切換。
請注意:它與CPU使用情況(CPU使用率)不是同一個概念。CPU使用率指的是CPU運行所有程序的耗時占所有時間的比例,它反映的是當前CPU的繁忙程度。舉個簡單例子,在單處理器中,線程1先工作10ms,線程2再工作30ms,之后CPU空閑60ms。則此100ms時間段內,CPU的利用率就是40%。如果CPU使用率持續居高,那么就需要考慮CPU是否已經處于超負荷運作,長期超負荷運作對于機器本身來說是一種損害,因此必須將CPU的利用率控制在一定的比例下,以保證機器的正常運作。
但是,反過來說,CPU使用率高,并不意味著CPU負載情況就一定大。舉例來說:如果我有一個程序需要一直使用CPU的運算功能,那么此時CPU的使用率可能達到100%,但是CPU的負載情況則是趨近于“1”,因為CPU僅負責一個工作嘛!此時的CPU雖然很忙,但是不會卡,你想要再增加一個程序(比如新開一個瀏覽器窗口)的話,應該問題不大,系統立即就可以響應你的操作。而如果同時執行兩個這樣的程序呢?CPU的使用率還是100%,但是負載情況則變成2了。再進一步的,如果同時執行10個這樣的程序,CPU的使用率依然是100%,可是負載情況變成了10,此時你想要再增加一個程序(比如新開一個瀏覽器窗口),則系統會變得非???#xff0c;甚至死機!
以上分析可以看出,一臺機器很有可能處于低使用率、高負載情況的情況,因此看機器的繁忙程度應該結合兩者,從實際的使用情況觀察。
可能上面的解釋不是很直觀,沒怎么聽懂。下面利用一個網上通用的比喻來形容一下【原文參見Understanding Linux CPU Load】,我添加了一些我自己的理解,讓文字看起來更形象一些,不知道有沒有形容不當的地方,若有發現還請不吝指正。
首先,假設最簡單的情況,你的電腦只有一個CPU,所有的運算都必須由這個CPU來完成。以下所有的分析都是基于這個前提的,請注意!
然后,我們把這個CPU想象成一座大橋,橋上只有一根車道,所有車輛都必須從這根車道上通過(很顯然,這座橋只能單向通行)。
- 系統負荷為0,意味著大橋上一輛車也沒有。一輛新來的車輛想要駛入,分分鐘就進來了,完全沒有問題(類比成你對電腦的操作,就好比你此時要新開一個音樂播放器,一點擊圖標,播放器立即就啟動了,完全無需等待,響應速度極快,很爽);
- 系統負荷為0.5,意味著大橋一半的路段有車。新來的車輛想要駛入,依然無需等待,瞬間進入(類比成新開音樂播放器的操作就是,一點擊圖標,播放器很快就啟動了,時延幾乎可以忽略);
- 系統負荷為1.0,意味著大橋的所有路段都有車,也就是說大橋已經"滿"了。但是必須注意的是,直到此時大橋還是能順暢通行的。同樣駛來了一輛新的車輛,此時它沒法瞬間駛入,而是必須在整個車流隊伍的末端進行排隊等候,但是好在車流很順暢,隊伍排一會就輪到它了(類比成新開音樂播放器的操作就是,點擊圖標之后,過了一小會播放器才啟動,讓你稍稍的等待了一小會,但是還在你可以接受的范圍之內);
- 系統負荷為1.7,意味著車輛太多了,大橋已經被占滿了,后面等著上橋的車輛為橋面車輛的70%。同樣還是那輛新的車輛要駛入,此時它要排隊的時間就明顯邊長了,而且很可能存在堵車的風險(類比成新開音樂播放器的操作就是,點擊圖標之后,過了好一會,播放器才開始啟動,而且啟動之后還很卡,半天才響應過來,讓你覺得有點郁悶+不爽了);
- 以此類推,系統負荷2.0時,意味著等待上橋的車輛與橋面的車輛一樣多,新來的車輛想要駛入的等候時間進一步變長;系統負荷3.0時,意味著等待上橋的車輛是橋面車輛的2倍??傊?#xff0c;當系統負荷大于1,后面的車輛就必須等待了;系統負荷越大,過橋就必須等得越久,直到最后可能就導致車流完全卡死,新來的車輛根本無法駛入了(類比成新開音樂播放器的操作就是,點擊圖標之后,過了很久很久,播放器完全沒有反應。你感覺似乎等了好幾分鐘了,實在是不耐煩了,于是再多點幾下,結果桌面反而卡死了,又隔了半天,系統居然彈了一個“播放器沒有響應,是否要結束任務?”的對話框出來,你毫不猶豫點擊結束任務,又是半天沒有動靜,似乎過了一個世紀之后,電腦完全卡死了,鼠標和鍵盤都不能用了,天地間只剩一個你在崩潰中重啟你的電腦…)。
CPU的系統負荷,基本上等同于上面的類比。大橋的通行能力,就是CPU的最大工作量;橋梁上的車輛,就是一個個等待CPU處理的進程(process)。
如果CPU每分鐘最多處理100個進程,那么系統負荷0.2意味著CPU在這1分鐘里只處理20個進程;系統負荷1.0意味著CPU在這1分鐘里正好處理100個進程;系統負荷1.7意味著除了CPU正在處理的100個進程以外,還有70個進程正排隊等著CPU處理。
從理論上來說,為了電腦順暢運行,系統負荷最好不要超過1.0,這樣就沒有進程需要等待了,所有進程都能第一時間得到處理。很顯然,1.0是一個關鍵值,超過這個值,系統就不在最佳狀態了,你要動手干預了。
當然,上面所有的案例中,我們假設你的電腦都只有1個CPU。如果你的電腦裝了2個CPU(或者是裝了一個雙核的CPU),會發生什么情況呢?
2個CPU(或者雙核CPU),意味著電腦的處理能力翻了一倍,能夠同時處理的進程數量也翻了一倍。還是用大橋來類比,兩個CPU就意味著大橋有兩根車道了,通車能力翻倍了。所以,2個CPU表明系統負荷可以達到2.0,此時每個CPU都達到100%的工作量。推廣開來,n個CPU核心的電腦,可接受的系統負荷最大為n.0。
二、如何查看CPU負載情況
首先要看下系統的CPU核心總數,這是前提,單核CPU與多核CPU的負載情況標準是完全不一樣的。使用以下命令查看CPU核心數:
leon@Ubuntu:~$ grep -c 'model name' /proc/cpuinfo 6然后就可以查看CPU的負載情況了。直接使用uptime命令就可以看到了:
leon@Ubuntu:~$ uptime20:21:34 up 11:30, 1 user, load average: 0.00, 0.00, 0.00load average后面跟的就是CPU的負載值了,這是三個平均值,分別代表的是系統在最近1分鐘、5分鐘、15分鐘內,CPU的平均負載情況(也可以說是平均進程數)。
另外,也可以通過/proc/loadavg文件來查看:
leon@Ubuntu:~$ cat /proc/loadavg 0.98 0.75 0.57 2/422 2879前三個數字大家都知道,是1、5、15分鐘內的負載情況。后面兩個呢,第一個(2/422)的分子2是正在運行的進程數,分母422是進程總數;后一個2879是最近運行的進程ID號。
當然,還可以使用下面更專業的top命令進行更加詳細的分析:
leon@Ubuntu:~$ toptop - 20:47:24 up 11:56, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 198 total, 1 running, 144 sleeping, 0 stopped, 1 zombie %Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 98.2 id, 1.5 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 3072672 total, 2074460 free, 553804 used, 444408 buff/cache KiB Swap: 998396 total, 839408 free, 158988 used. 2317720 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 906 root 20 0 585180 100336 18024 S 1.3 3.3 3:12.98 Xorg 2404 leon 20 0 1369504 85028 41244 S 1.0 2.8 4:24.27 compiz 2620 leon 20 0 617872 31252 20524 S 0.7 1.0 0:08.99 gnome-term+ 2122 leon 20 0 403148 1192 816 S 0.3 0.0 0:00.83 indicator-+ 1 root 20 0 185220 3916 2464 S 0.0 0.1 0:02.59 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:+ 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_+ 7 root 20 0 0 0 0 S 0.0 0.0 0:00.16 ksoftirqd/0三、如何解讀CPU負載情況
可以看到,"load average"一共返回三個值,這是3個平均值,分別代表的是系統在最近1分鐘、5分鐘、15分鐘內,CPU的平均負載情況。這三個值落在什么范圍內才算合理,超過什么范圍會造成系統異常?在實際應用中怎么解讀呢?哪個才是最準確的值呢?
首先我們分析一下這幾個值的取值范圍。拿單核CPU來舉例,根據網上的經驗值,一般將分水嶺設成0.7。經驗法則是這樣的:
- 當系統負荷持續小于0.7(指的是調整CPU核心數之后的相對值),表明系統非常健康,任務處理的很及時,效率很高,基本沒有時延存在。
- 當系統負荷持續大于0.7(指的是調整CPU核心數之后的相對值),表明系統有點忙了,你必須開始調查了,問題出在哪里,防止情況惡化。
- 當系統負荷持續大于1.0(指的是調整CPU核心數之后的相對值),表明系統很忙了,你必須動手尋找解決辦法,想辦法把這個值降下來。
- 當系統負荷持續大于3.0(指的是調整CPU核心數之后的相對值),表明系統非常非常忙了,甚至影響到正常的功能了,你得趕緊處理了;
- 當系統負荷持續達到5.0(指的是調整CPU核心數之后的相對值),就表明你的系統有極其嚴重的問題,長時間沒有響應,或者接近死機了。你不應該讓系統達到這個值。
然后我們來解讀一下這三個值的重要級別。在實際的使用中,我們一般認為,如果只有1分鐘的系統負荷過大,其他兩個時間段都很正常(指的是調整CPU核心數之后的相對值),這表明只是暫時現象,問題不大。如果連15分鐘的平均系統負荷也偏大了(指的是調整CPU核心數之后的相對值),表明問題持續存在,則要引起重視了。所以,應該主要觀察"15分鐘系統負荷",將它作為電腦正常運行的指標。
總結
以上是生活随笔為你收集整理的如何理解和分析linux系统的CPU平均负载情况(load average)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 内存清理
- 下一篇: 特斯拉美国 Model Y 涨价 100