如何理解和分析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,此時你想要再增加一個程序(比如新開一個瀏覽器窗口),則系統會變得非常卡,甚至死機!

以上分析可以看出,一臺機器很有可能處於低使用率、高負載情況的情況,因此看機器的繁忙程度應該結合兩者,從實際的使用情況觀察。

可能上面的解釋不是很直觀,沒怎麼聽懂。下面利用一個網上通用的比喻來形容一下【原文參見Understanding Linux CPU Load】,我添加了一些我自己的理解,讓文字看起來更形象一些,不知道有沒有形容不當的地方,若有發現還請不吝指正。

首先,假設最簡單的情況,你的電腦只有一個CPU,所有的運算都必須由這個CPU來完成。以下所有的分析都是基於這個前提的,請注意!

然後,我們把這個CPU想象成一座大橋,橋上只有一根車道,所有車輛都必須從這根車道上通過(很顯然,這座橋只能單向通行)。

  • 系統負荷爲0,意味着大橋上一輛車也沒有。一輛新來的車輛想要駛入,分分鐘就進來了,完全沒有問題(類比成你對電腦的操作,就好比你此時要新開一個音樂播放器,一點擊圖標,播放器立即就啓動了,完全無需等待,響應速度極快,很爽);
  • 系統負荷爲0.5,意味着大橋一半的路段有車。新來的車輛想要駛入,依然無需等待,瞬間進入(類比成新開音樂播放器的操作就是,一點擊圖標,播放器很快就啓動了,時延幾乎可以忽略);
  • 系統負荷爲1.0,意味着大橋的所有路段都有車,也就是說大橋已經"滿"了。但是必須注意的是,直到此時大橋還是能順暢通行的。同樣駛來了一輛新的車輛,此時它沒法瞬間駛入,而是必須在整個車流隊伍的末端進行排隊等候,但是好在車流很順暢,隊伍排一會就輪到它了(類比成新開音樂播放器的操作就是,點擊圖標之後,過了一小會播放器才啓動,讓你稍稍的等待了一小會,但是還在你可以接受的範圍之內);
  • 系統負荷爲1.7,意味着車輛太多了,大橋已經被佔滿了,後面等着上橋的車輛爲橋面車輛的70%。同樣還是那輛新的車輛要駛入,此時它要排隊的時間就明顯邊長了,而且很可能存在堵車的風險(類比成新開音樂播放器的操作就是,點擊圖標之後,過了好一會,播放器纔開始啓動,而且啓動之後還很卡,半天才響應過來,讓你覺得有點鬱悶+不爽了);
  • 以此類推,系統負荷2.0時,意味着等待上橋的車輛與橋面的車輛一樣多,新來的車輛想要駛入的等候時間進一步變長;系統負荷3.0時,意味着等待上橋的車輛是橋面車輛的2倍。總之,當系統負荷大於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:~$ uptime
 20:21:34 up 11:30,  1 user,  load average: 0.00, 0.00, 0.00

load 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:~$ top

top - 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分鐘系統負荷",將它作爲電腦正常運行的指標。

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