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