如何理解和分析linux系统的CPU平均负载情况(load average)
最近研究linux時(shí)接觸到了一個(gè)新的概念,叫做CPU的平均負(fù)載(load average)。之前都只聽說(shuō)過(guò)CPU的使用情況,很少聽說(shuō)過(guò)負(fù)載情況。于是對(duì)這個(gè)概念進(jìn)行了一下研究學(xué)習(xí),總結(jié)如下,以便日后查閱。
一、如何理解CPU負(fù)載情況
CPU負(fù)載情況定義為在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的進(jìn)程數(shù)量的平均值,換句話說(shuō)就是該段時(shí)間內(nèi)正在使用和等待使用CPU的平均任務(wù)數(shù)。CPU的負(fù)載越大,代表CPU必須要在不同的工作之間進(jìn)行頻繁的工作切換。
請(qǐng)注意:它與CPU使用情況(CPU使用率)不是同一個(gè)概念。CPU使用率指的是CPU運(yùn)行所有程序的耗時(shí)占所有時(shí)間的比例,它反映的是當(dāng)前CPU的繁忙程度。舉個(gè)簡(jiǎn)單例子,在單處理器中,線程1先工作10ms,線程2再工作30ms,之后CPU空閑60ms。則此100ms時(shí)間段內(nèi),CPU的利用率就是40%。如果CPU使用率持續(xù)居高,那么就需要考慮CPU是否已經(jīng)處于超負(fù)荷運(yùn)作,長(zhǎng)期超負(fù)荷運(yùn)作對(duì)于機(jī)器本身來(lái)說(shuō)是一種損害,因此必須將CPU的利用率控制在一定的比例下,以保證機(jī)器的正常運(yùn)作。
但是,反過(guò)來(lái)說(shuō),CPU使用率高,并不意味著CPU負(fù)載情況就一定大。舉例來(lái)說(shuō):如果我有一個(gè)程序需要一直使用CPU的運(yùn)算功能,那么此時(shí)CPU的使用率可能達(dá)到100%,但是CPU的負(fù)載情況則是趨近于“1”,因?yàn)镃PU僅負(fù)責(zé)一個(gè)工作嘛!此時(shí)的CPU雖然很忙,但是不會(huì)卡,你想要再增加一個(gè)程序(比如新開一個(gè)瀏覽器窗口)的話,應(yīng)該問(wèn)題不大,系統(tǒng)立即就可以響應(yīng)你的操作。而如果同時(shí)執(zhí)行兩個(gè)這樣的程序呢?CPU的使用率還是100%,但是負(fù)載情況則變成2了。再進(jìn)一步的,如果同時(shí)執(zhí)行10個(gè)這樣的程序,CPU的使用率依然是100%,可是負(fù)載情況變成了10,此時(shí)你想要再增加一個(gè)程序(比如新開一個(gè)瀏覽器窗口),則系統(tǒng)會(huì)變得非常卡,甚至死機(jī)!
以上分析可以看出,一臺(tái)機(jī)器很有可能處于低使用率、高負(fù)載情況的情況,因此看機(jī)器的繁忙程度應(yīng)該結(jié)合兩者,從實(shí)際的使用情況觀察。
可能上面的解釋不是很直觀,沒(méi)怎么聽懂。下面利用一個(gè)網(wǎng)上通用的比喻來(lái)形容一下【原文參見Understanding Linux CPU Load】,我添加了一些我自己的理解,讓文字看起來(lái)更形象一些,不知道有沒(méi)有形容不當(dāng)?shù)牡胤?#xff0c;若有發(fā)現(xiàn)還請(qǐng)不吝指正。
首先,假設(shè)最簡(jiǎn)單的情況,你的電腦只有一個(gè)CPU,所有的運(yùn)算都必須由這個(gè)CPU來(lái)完成。以下所有的分析都是基于這個(gè)前提的,請(qǐng)注意!
然后,我們把這個(gè)CPU想象成一座大橋,橋上只有一根車道,所有車輛都必須從這根車道上通過(guò)(很顯然,這座橋只能單向通行)。
- 系統(tǒng)負(fù)荷為0,意味著大橋上一輛車也沒(méi)有。一輛新來(lái)的車輛想要駛?cè)?#xff0c;分分鐘就進(jìn)來(lái)了,完全沒(méi)有問(wèn)題(類比成你對(duì)電腦的操作,就好比你此時(shí)要新開一個(gè)音樂(lè)播放器,一點(diǎn)擊圖標(biāo),播放器立即就啟動(dòng)了,完全無(wú)需等待,響應(yīng)速度極快,很爽);
- 系統(tǒng)負(fù)荷為0.5,意味著大橋一半的路段有車。新來(lái)的車輛想要駛?cè)?#xff0c;依然無(wú)需等待,瞬間進(jìn)入(類比成新開音樂(lè)播放器的操作就是,一點(diǎn)擊圖標(biāo),播放器很快就啟動(dòng)了,時(shí)延幾乎可以忽略);
- 系統(tǒng)負(fù)荷為1.0,意味著大橋的所有路段都有車,也就是說(shuō)大橋已經(jīng)"滿"了。但是必須注意的是,直到此時(shí)大橋還是能順暢通行的。同樣駛來(lái)了一輛新的車輛,此時(shí)它沒(méi)法瞬間駛?cè)?#xff0c;而是必須在整個(gè)車流隊(duì)伍的末端進(jìn)行排隊(duì)等候,但是好在車流很順暢,隊(duì)伍排一會(huì)就輪到它了(類比成新開音樂(lè)播放器的操作就是,點(diǎn)擊圖標(biāo)之后,過(guò)了一小會(huì)播放器才啟動(dòng),讓你稍稍的等待了一小會(huì),但是還在你可以接受的范圍之內(nèi));
- 系統(tǒng)負(fù)荷為1.7,意味著車輛太多了,大橋已經(jīng)被占滿了,后面等著上橋的車輛為橋面車輛的70%。同樣還是那輛新的車輛要駛?cè)?#xff0c;此時(shí)它要排隊(duì)的時(shí)間就明顯邊長(zhǎng)了,而且很可能存在堵車的風(fēng)險(xiǎn)(類比成新開音樂(lè)播放器的操作就是,點(diǎn)擊圖標(biāo)之后,過(guò)了好一會(huì),播放器才開始啟動(dòng),而且啟動(dòng)之后還很卡,半天才響應(yīng)過(guò)來(lái),讓你覺(jué)得有點(diǎn)郁悶+不爽了);
- 以此類推,系統(tǒng)負(fù)荷2.0時(shí),意味著等待上橋的車輛與橋面的車輛一樣多,新來(lái)的車輛想要駛?cè)氲牡群驎r(shí)間進(jìn)一步變長(zhǎng);系統(tǒng)負(fù)荷3.0時(shí),意味著等待上橋的車輛是橋面車輛的2倍。總之,當(dāng)系統(tǒng)負(fù)荷大于1,后面的車輛就必須等待了;系統(tǒng)負(fù)荷越大,過(guò)橋就必須等得越久,直到最后可能就導(dǎo)致車流完全卡死,新來(lái)的車輛根本無(wú)法駛?cè)肓?#xff08;類比成新開音樂(lè)播放器的操作就是,點(diǎn)擊圖標(biāo)之后,過(guò)了很久很久,播放器完全沒(méi)有反應(yīng)。你感覺(jué)似乎等了好幾分鐘了,實(shí)在是不耐煩了,于是再多點(diǎn)幾下,結(jié)果桌面反而卡死了,又隔了半天,系統(tǒng)居然彈了一個(gè)“播放器沒(méi)有響應(yīng),是否要結(jié)束任務(wù)?”的對(duì)話框出來(lái),你毫不猶豫點(diǎn)擊結(jié)束任務(wù),又是半天沒(méi)有動(dòng)靜,似乎過(guò)了一個(gè)世紀(jì)之后,電腦完全卡死了,鼠標(biāo)和鍵盤都不能用了,天地間只剩一個(gè)你在崩潰中重啟你的電腦…)。
CPU的系統(tǒng)負(fù)荷,基本上等同于上面的類比。大橋的通行能力,就是CPU的最大工作量;橋梁上的車輛,就是一個(gè)個(gè)等待CPU處理的進(jìn)程(process)。
如果CPU每分鐘最多處理100個(gè)進(jìn)程,那么系統(tǒng)負(fù)荷0.2意味著CPU在這1分鐘里只處理20個(gè)進(jìn)程;系統(tǒng)負(fù)荷1.0意味著CPU在這1分鐘里正好處理100個(gè)進(jìn)程;系統(tǒng)負(fù)荷1.7意味著除了CPU正在處理的100個(gè)進(jìn)程以外,還有70個(gè)進(jìn)程正排隊(duì)等著CPU處理。
從理論上來(lái)說(shuō),為了電腦順暢運(yùn)行,系統(tǒng)負(fù)荷最好不要超過(guò)1.0,這樣就沒(méi)有進(jìn)程需要等待了,所有進(jìn)程都能第一時(shí)間得到處理。很顯然,1.0是一個(gè)關(guān)鍵值,超過(guò)這個(gè)值,系統(tǒng)就不在最佳狀態(tài)了,你要?jiǎng)邮指深A(yù)了。
當(dāng)然,上面所有的案例中,我們假設(shè)你的電腦都只有1個(gè)CPU。如果你的電腦裝了2個(gè)CPU(或者是裝了一個(gè)雙核的CPU),會(huì)發(fā)生什么情況呢?
2個(gè)CPU(或者雙核CPU),意味著電腦的處理能力翻了一倍,能夠同時(shí)處理的進(jìn)程數(shù)量也翻了一倍。還是用大橋來(lái)類比,兩個(gè)CPU就意味著大橋有兩根車道了,通車能力翻倍了。所以,2個(gè)CPU表明系統(tǒng)負(fù)荷可以達(dá)到2.0,此時(shí)每個(gè)CPU都達(dá)到100%的工作量。推廣開來(lái),n個(gè)CPU核心的電腦,可接受的系統(tǒng)負(fù)荷最大為n.0。
二、如何查看CPU負(fù)載情況
首先要看下系統(tǒng)的CPU核心總數(shù),這是前提,單核CPU與多核CPU的負(fù)載情況標(biāo)準(zhǔn)是完全不一樣的。使用以下命令查看CPU核心數(shù):
leon@Ubuntu:~$ grep -c 'model name' /proc/cpuinfo 6然后就可以查看CPU的負(fù)載情況了。直接使用uptime命令就可以看到了:
leon@Ubuntu:~$ uptime20:21:34 up 11:30, 1 user, load average: 0.00, 0.00, 0.00load average后面跟的就是CPU的負(fù)載值了,這是三個(gè)平均值,分別代表的是系統(tǒng)在最近1分鐘、5分鐘、15分鐘內(nèi),CPU的平均負(fù)載情況(也可以說(shuō)是平均進(jìn)程數(shù))。
另外,也可以通過(guò)/proc/loadavg文件來(lái)查看:
leon@Ubuntu:~$ cat /proc/loadavg 0.98 0.75 0.57 2/422 2879前三個(gè)數(shù)字大家都知道,是1、5、15分鐘內(nèi)的負(fù)載情況。后面兩個(gè)呢,第一個(gè)(2/422)的分子2是正在運(yùn)行的進(jìn)程數(shù),分母422是進(jìn)程總數(shù);后一個(gè)2879是最近運(yùn)行的進(jìn)程ID號(hào)。
當(dāng)然,還可以使用下面更專業(yè)的top命令進(jìn)行更加詳細(xì)的分析:
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負(fù)載情況
可以看到,"load average"一共返回三個(gè)值,這是3個(gè)平均值,分別代表的是系統(tǒng)在最近1分鐘、5分鐘、15分鐘內(nèi),CPU的平均負(fù)載情況。這三個(gè)值落在什么范圍內(nèi)才算合理,超過(guò)什么范圍會(huì)造成系統(tǒng)異常?在實(shí)際應(yīng)用中怎么解讀呢?哪個(gè)才是最準(zhǔn)確的值呢?
首先我們分析一下這幾個(gè)值的取值范圍。拿單核CPU來(lái)舉例,根據(jù)網(wǎng)上的經(jīng)驗(yàn)值,一般將分水嶺設(shè)成0.7。經(jīng)驗(yàn)法則是這樣的:
- 當(dāng)系統(tǒng)負(fù)荷持續(xù)小于0.7(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),表明系統(tǒng)非常健康,任務(wù)處理的很及時(shí),效率很高,基本沒(méi)有時(shí)延存在。
- 當(dāng)系統(tǒng)負(fù)荷持續(xù)大于0.7(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),表明系統(tǒng)有點(diǎn)忙了,你必須開始調(diào)查了,問(wèn)題出在哪里,防止情況惡化。
- 當(dāng)系統(tǒng)負(fù)荷持續(xù)大于1.0(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),表明系統(tǒng)很忙了,你必須動(dòng)手尋找解決辦法,想辦法把這個(gè)值降下來(lái)。
- 當(dāng)系統(tǒng)負(fù)荷持續(xù)大于3.0(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),表明系統(tǒng)非常非常忙了,甚至影響到正常的功能了,你得趕緊處理了;
- 當(dāng)系統(tǒng)負(fù)荷持續(xù)達(dá)到5.0(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),就表明你的系統(tǒng)有極其嚴(yán)重的問(wèn)題,長(zhǎng)時(shí)間沒(méi)有響應(yīng),或者接近死機(jī)了。你不應(yīng)該讓系統(tǒng)達(dá)到這個(gè)值。
然后我們來(lái)解讀一下這三個(gè)值的重要級(jí)別。在實(shí)際的使用中,我們一般認(rèn)為,如果只有1分鐘的系統(tǒng)負(fù)荷過(guò)大,其他兩個(gè)時(shí)間段都很正常(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),這表明只是暫時(shí)現(xiàn)象,問(wèn)題不大。如果連15分鐘的平均系統(tǒng)負(fù)荷也偏大了(指的是調(diào)整CPU核心數(shù)之后的相對(duì)值),表明問(wèn)題持續(xù)存在,則要引起重視了。所以,應(yīng)該主要觀察"15分鐘系統(tǒng)負(fù)荷",將它作為電腦正常運(yùn)行的指標(biāo)。
總結(jié)
以上是生活随笔為你收集整理的如何理解和分析linux系统的CPU平均负载情况(load average)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos 内存清理
- 下一篇: 【精选】uboot/linux/qt/b