什么是平均負(fù)載
系統(tǒng)平均負(fù)載是可運(yùn)行或不中斷的平均進(jìn)程數(shù)。
處于可運(yùn)行狀態(tài)的進(jìn)程正在使用CPU或等待使用CPU。無(wú)限的過(guò)程
可中斷狀態(tài)正在等待某些I / O訪(fǎng)問(wèn),例如,等待磁盤(pán)。取三項(xiàng)平均值
時(shí)間間隔。負(fù)載平均沒(méi)有針對(duì)系統(tǒng)中的CPU數(shù)量標(biāo)準(zhǔn)化,因此負(fù)載平均為1
表示一直裝載單個(gè)CPU系統(tǒng),而在4個(gè)CPU系統(tǒng)上則意味著75%的時(shí)間處于空閑狀態(tài)
如何查看系統(tǒng)的平均負(fù)載
uptime 命令
例如
uptime
16:00:44 up 2 min, 0 users, load average: 0.52, 0.58, 0.59
uptime 命令的平均負(fù)載值和cpu數(shù)量有密切的關(guān)系
平均負(fù)載案例分析
下?,我們以三個(gè)示例分別來(lái)看這三種情況,并? IOStat、mpstat、pidstat 等?具,找出平均負(fù)載升?的根源。
因?yàn)榘咐治龆际腔跈C(jī)器上的操作,所以不要只是聽(tīng)聽(tīng)、看看就夠了,最好還是跟著我實(shí)際操作?下。
你的準(zhǔn)備
下?的案例都是基于 Ubuntu 18.04,當(dāng)然,同樣適?于其他 linux 系統(tǒng)。我使?的案例環(huán)境如下所示。
機(jī)器配置:2 CPU,8GB 內(nèi)存。預(yù)先安裝 stress 和 sysstat 包,如 apt install stress sysstat。
在這?,我先簡(jiǎn)單介紹?下 stress 和 sysstat。
stress 是?個(gè) Linux 系統(tǒng)壓?測(cè)試?具,這?我們?作異常進(jìn)程模擬平均負(fù)載升?的場(chǎng)景。
? sysstat 包含了常?的 Linux 性能?具,?來(lái)監(jiān)控和分析系統(tǒng)的性能。我們的案例會(huì)?到這個(gè)包的兩個(gè)命令 mpstat 和pidstat。
mpstat 是?個(gè)常?的多核 CPU 性能分析?具,?來(lái)實(shí)時(shí)查看每個(gè) CPU 的性能指標(biāo),以及所有CPU的平均指標(biāo)。
pidstat 是?個(gè)常?的進(jìn)程性能分析?具,?來(lái)實(shí)時(shí)查看進(jìn)程的 CPU、內(nèi)存、I/O 以及上下?切換等性能指標(biāo)。
此外,每個(gè)場(chǎng)景都需要你開(kāi)三個(gè)終端,登錄到同?臺(tái) Linux 機(jī)器中。
實(shí)驗(yàn)之前,你先做好上?的準(zhǔn)備。如果包的安裝有問(wèn)題,可以先在google?下??解決,如果還是解決不了,再來(lái)留?區(qū)找
我,這事?應(yīng)該不難。
另外要注意,下?的所有命令,我們都是默認(rèn)以 root ?戶(hù)運(yùn)?。所以,如果你是?普通?戶(hù)登陸的系統(tǒng),一定要先運(yùn)? sudo
su root 命令切換到 root ?戶(hù)。
如果上?的要求都已經(jīng)完成了,你可以先? uptime 命令,看一下測(cè)試前的平均負(fù)載情況:
$ uptime
..., load average: 0.11, 0.15, 0.09
場(chǎng)景?:CPU 密集型進(jìn)程
?先,我們?cè)诘?個(gè)終端運(yùn)? stress 命令,模擬?個(gè) CPU 使?率 100% 的場(chǎng)景:
$ stress --cpu 1 --timeout 600
接著,在第?個(gè)終端運(yùn)?uptime查看平均負(fù)載的變化情況:
# -d 參數(shù)表示?亮顯示變化的區(qū)域
$ watch -d uptime
..., load average: 1.00, 0.75, 0.39
最后,在第三個(gè)終端運(yùn)?mpstat查看 CPU 使?率的變化情況:
# -P ALL 表示監(jiān)控所有CPU,后?數(shù)字5表示間隔5秒后輸出?組數(shù)據(jù)
$ mpstat -P ALL 5
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:30:06 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:30:11 all 50.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 49.95
13:30:11 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
13:30:11 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00從終端?中可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.00,?從終端三中還可以看到,正好有?個(gè) CPU 的使?率為
100%,但它的 iowait 只有 0。這說(shuō)明,平均負(fù)載的升?正是由于 CPU 使?率為 100% 。
那么,到底是哪個(gè)進(jìn)程導(dǎo)致了 CPU 使?率為 100% 呢?你可以使? pidstat 來(lái)查詢(xún):
# 間隔5秒后輸出?組數(shù)據(jù)
$ pidstat -u 5 1
13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command
13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress
從這?可以明顯看到,stress進(jìn)程的CPU使?率為100%。
場(chǎng)景?:I/O 密集型進(jìn)程
?先還是運(yùn)? stress 命令,但這次模擬 I/O 壓?,即不停地執(zhí)? sync:
$ stress -i 1 --timeout 600
還是在第?個(gè)終端運(yùn)?uptime查看平均負(fù)載的變化情況:
$ watch -d uptime
..., load average: 1.06, 0.58, 0.37
然后,第三個(gè)終端運(yùn)?mpstat查看 CPU 使?率的變化情況:
# 顯示所有CPU的指標(biāo),并在間隔5秒輸出?組數(shù)據(jù)
$ mpstat -P ALL 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:41:28 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
13:41:33 all 0.21 0.00 12.07 32.67 0.00 0.21 0.00 0.00 0.00 54.84
13:41:33 0 0.43 0.00 23.87 67.53 0.00 0.43 0.00 0.00 0.00 7.74
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99
從這?可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.06,其中?個(gè) CPU 的系統(tǒng)CPU使?率升?到了 23.87,? iowait ?達(dá)
67.53%。這說(shuō)明,平均負(fù)載的升?是由于 iowait 的升?。
那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么?呢?我們還是? pidstat 來(lái)查詢(xún):# 間隔5秒后輸出?組數(shù)據(jù),-u表示CPU指標(biāo)
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu) 09/22/18 _x86_64_ (2 CPU)
13:42:08 UID PID %usr %system %guest %wait %CPU CPU Command
13:42:13 0 104 0.00 3.39 0.00 0.00 3.39 1 kworker/1:1H
13:42:13 0 109 0.00 0.40 0.00 0.00 0.40 0 kworker/0:1H
13:42:13 0 2997 2.00 35.53 0.00 3.99 37.52 1 stress
13:42:13 0 3057 0.00 0.40 0.00 0.00 0.40 0 pidstat
可以發(fā)現(xiàn),還是 stress 進(jìn)程導(dǎo)致的。
場(chǎng)景三:?量進(jìn)程的場(chǎng)景
當(dāng)系統(tǒng)中運(yùn)?進(jìn)程超出 CPU 運(yùn)?能?時(shí),就會(huì)出現(xiàn)等待 CPU 的進(jìn)程。
?如,我們還是使? stress,但這次模擬的是 8 個(gè)進(jìn)程:
$ stress -c 8 --timeout 600
由于系統(tǒng)只有 2 個(gè)CPU,明顯? 8 個(gè)進(jìn)程要少得多,因?,系統(tǒng)的 CPU 處于嚴(yán)重過(guò)載狀態(tài),平均負(fù)載?達(dá)7.97:
$ uptime
..., load average: 7.97, 5.93, 3.02
接著再運(yùn)?pidstat來(lái)看?下進(jìn)程的情況:
# 間隔5秒后輸出?組數(shù)據(jù)
$ pidstat -u 5 1
14:23:25 UID PID %usr %system %guest %wait %CPU CPU Command
14:23:30 0 3190 25.00 0.00 0.00 74.80 25.00 0 stress
14:23:30 0 3191 25.00 0.00 0.00 75.20 25.00 0 stress
14:23:30 0 3192 25.00 0.00 0.00 74.80 25.00 1 stress
14:23:30 0 3193 25.00 0.00 0.00 75.00 25.00 1 stress
14:23:30 0 3194 24.80 0.00 0.00 74.60 24.80 0 stress
14:23:30 0 3195 24.80 0.00 0.00 75.00 24.80 0 stress
14:23:30 0 3196 24.80 0.00 0.00 74.60 24.80 1 stress
14:23:30 0 3197 24.80 0.00 0.00 74.80 24.80 1 stress
14:23:30 0 3200 0.00 0.20 0.00 0.20 0.20 0 pidstat
可以看出,8 個(gè)進(jìn)程在爭(zhēng)搶 2 個(gè) CPU,每個(gè)進(jìn)程等待 CPU 的時(shí)間(也就是代碼塊中的 %wait 列)?達(dá) 75%。這些超出 CPU
計(jì)算能?的進(jìn)程,最終導(dǎo)致 CPU 過(guò)載。
總結(jié)
分析完這三個(gè)案例,我再來(lái)歸納總結(jié)下平均負(fù)載的理解。平均負(fù)載提供了一個(gè)快速查看系統(tǒng)整體性能的?段,反映了整體的負(fù)載情況。但只看平均負(fù)載本身,我們并不能直接發(fā)現(xiàn),到
底是哪?出現(xiàn)了瓶頸。所以,在理解平均負(fù)載時(shí),也要注意:
平均負(fù)載?有可能是 CPU 密集型進(jìn)程導(dǎo)致的;
平均負(fù)載?并不?定代表 CPU 使?率?,還有可能是 I/O 更繁忙了;
當(dāng)發(fā)現(xiàn)負(fù)載?的時(shí)候,你可以使? mpstat、pidstat 等?具,輔助分析負(fù)載的來(lái)源。






