uptime 命令最后3列:分別表示過(guò)去1分鐘寒匙,5分鐘乌助,15分鐘的平均負(fù)載
那什么是平均負(fù)載呢罕偎?
簡(jiǎn)單來(lái)說(shuō)就是單位時(shí)間內(nèi)很澄,系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù)。(和cup使用率沒(méi)有直接關(guān)系)
- 可運(yùn)行狀態(tài)進(jìn)程
指正在被cpu或者等待cpu的進(jìn)程颜及。也就是我們常用的ps查看的R狀態(tài)的進(jìn)程 - 不可中斷狀態(tài)進(jìn)程
指正在處于內(nèi)核態(tài)關(guān)鍵流程的進(jìn)程甩苛,這些流程不可以被打斷,比如等待硬件I/O響應(yīng)俏站,ps查看是D狀態(tài)的進(jìn)程讯蒲。(disk sleep)
通過(guò)平均負(fù)載能得到什么信息?
首先應(yīng)該先查看當(dāng)前機(jī)器的cpu核數(shù)(邏輯核數(shù),而不是物理核數(shù))
grep 'model name' /proc/cpuinfo |wc -l
比如當(dāng)前平均負(fù)載是2:
在2個(gè)cpu的機(jī)器上肄扎,意味著所有的cpu都剛好被完全占有
在4個(gè)cpu的機(jī)器上墨林,意味著有cpu有50%空閑
在1個(gè)cpu的機(jī)器上,意味著有一半的進(jìn)程得不到cpu
我們通過(guò)1,5,15分鐘的平均負(fù)載犯祠,可以看到當(dāng)前系統(tǒng)的負(fù)載趨勢(shì)旭等。
例如:單cpu的機(jī)器: 1.73 0.63 7.9
那么說(shuō)明系統(tǒng)在過(guò)去1分鐘有73%的超載,15分鐘時(shí)候690%的超載衡载。整體趨勢(shì)是平均負(fù)載下降搔耕。
根據(jù)經(jīng)驗(yàn),當(dāng)系統(tǒng)超過(guò)負(fù)載 70%的時(shí)候月劈,就應(yīng)該要排查高負(fù)載問(wèn)題度迂。(大牛的經(jīng)驗(yàn))
平均負(fù)載和cpu使用率
cpu和平均負(fù)載沒(méi)有直接關(guān)系
- cpu密集型環(huán)境,cpu使用率高猜揪,平均負(fù)載高
- IO密集型環(huán)境惭墓,cpu使用率不一定高,平均負(fù)載高
- 大量等待cpu的進(jìn)程調(diào)度而姐,也會(huì)使cpu提高腊凶,平均負(fù)載也高
案例模擬
安裝stress和sysstat。stress的centos版本較老,顯示的時(shí)候會(huì)沒(méi)有%wait列钧萍。有需要可以選擇源碼安裝
場(chǎng)景1
模擬cpu密集(打開(kāi)3個(gè)終端)
終端1:
stress --cpu 1 --timeout 600
終端2::
watch -d uptime
終端3:
mpstat -P ALL 5
可以看到褐缠,用戶態(tài)的cpu使用率為100%。由此可以確定是用戶進(jìn)程導(dǎo)致的cpu升高风瘦,具體是哪個(gè)進(jìn)程呢队魏?
pidstat -u 5 1
由此,找到了進(jìn)程id是10184万搔,進(jìn)程名為stress胡桨。是我們剛剛的壓力模擬進(jìn)程。
場(chǎng)景2
stress -i 1 --timeout 600
mpstat -P ALL 5
觀察后發(fā)現(xiàn)瞬雹,%sys 和 %idle加起來(lái)幾乎占滿了cpu昧谊。
pidstat -u 5
為什么沒(méi)有看到iowait升高。反而是cpu等升高了呢酗捌,原因是stress的原理是使用sync()系統(tǒng)調(diào)用呢诬,是刷新緩沖區(qū)到磁盤,新機(jī)器往往緩存區(qū)較小胖缤。無(wú)法產(chǎn)生較大的io尚镰。所以只看到了系統(tǒng)使用率升高等。應(yīng)該使用下一代的stress-ng草姻,支持更豐富的選項(xiàng)钓猬。如:stress-ng -i 1 --hdd 1 --timeout 600(-hdd表示讀寫臨時(shí)文件)
pidstat沒(méi)有%wait項(xiàng),原因是centos默認(rèn)的sysstat版本較老撩独,在11.5.5以后才加入敞曹,我嘗試了11.5.5后發(fā)現(xiàn)版本有問(wèn)題,有了%iowait列综膀,但是內(nèi)容為空澳迫。最后從git上換了12.x.x版本后就好了