1. 平均負(fù)載的查看
在Linux系統(tǒng)中,如果我們想查看系統(tǒng)的負(fù)載,可以通過top
指令或者uptime
指令。以uptime
指令為例,可以看到以下輸出:
[root@hadoop05 ~]# uptime
22:13:29 up 4 min, 3 users, load average: 1.17, 1.36, 0.63
uptime
指令輸出數(shù)據(jù)的各項(xiàng)含義如下
22:13:29 系統(tǒng)的當(dāng)前時(shí)間
up 4 min 系統(tǒng)運(yùn)行的時(shí)間
3 users 登錄的用戶數(shù)
load average: 1.17, 1.36, 0.63 系統(tǒng)在過去的1分鐘、5分鐘、15分鐘內(nèi)的平均負(fù)載
2. 平均負(fù)載的正確含義
關(guān)于平均負(fù)載,有個(gè)不太準(zhǔn)確理解:平均負(fù)載代表單位時(shí)間內(nèi)的cpu使用率。
平均負(fù)載的正確含義指的是:單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)(正在使用CPU或者正在等待CPU的進(jìn)程,stat=R)和不可中斷狀態(tài)(可能在等待IO, stat=D)的平均進(jìn)程數(shù)
,和CPU使用率沒有直接關(guān)系。
2.1 進(jìn)程的狀態(tài)
我們可以通過ps -aux
指令來查看系統(tǒng)的狀態(tài)
[root@hadoop05 ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.3 128448 6080 ? Ss 22:09 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 22:09 0:00 [kthreadd]
root 3 0.5 0.0 0 0 ? S 22:09 0:11 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 22:09 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 22:09 0:01 [kworker/u128:0]
root 7 0.0 0.0 0 0 ? S 22:09 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 22:09 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 22:09 0:02 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 22:09 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 22:09 0:00 [kdevtmpfs]
root 13 0.0 0.0 0 0 ? S< 22:09 0:00 [netns]
root 14 0.0 0.0 0 0 ? S 22:09 0:00 [khungtaskd]
root 15 0.0 0.0 0 0 ? S< 22:09 0:00 [writeback]
root 16 0.0 0.0 0 0 ? S< 22:09 0:00 [kintegrityd]
root 17 0.0 0.0 0 0 ? S< 22:09 0:00 [bioset]
root 18 0.0 0.0 0 0 ? S< 22:09 0:00 [kblockd]
root 19 0.0 0.0 0 0 ? S< 22:09 0:00 [md]
root 25 0.0 0.0 0 0 ? S 22:09 0:00 [kswapd0]
root 26 0.0 0.0 0 0 ? SN 22:09 0:00 [ksmd]
其中STAT就表示進(jìn)程的狀態(tài),其狀態(tài)有以下幾種:
D 不可中斷睡眠 (通常是在IO操作) 收到信號(hào)不喚醒和不可運(yùn)行, 進(jìn)程必須等待直到有中斷發(fā)生,一般比較短,在ps指令中不易看到
R 正在運(yùn)行或可運(yùn)行(在運(yùn)行隊(duì)列排隊(duì)中)
S 可中斷睡眠 (休眠中, 受阻, 在等待某個(gè)條件的形成或接受到信號(hào))
T 已停止的 進(jìn)程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號(hào)后停止運(yùn)行
W 正在換頁(yè)(2.6.內(nèi)核之前有效)
X 死進(jìn)程 (未開啟)
Z 僵尸進(jìn)程 進(jìn)程已終止, 但進(jìn)程描述符存在, 直到父進(jìn)程調(diào)用wait4()系統(tǒng)調(diào)用后釋放BSD風(fēng)格的
< 高優(yōu)先級(jí)(not nice to other users)
N 低優(yōu)先級(jí)(nice to other users)
L 頁(yè)面鎖定在內(nèi)存(實(shí)時(shí)和定制的IO)
s 一個(gè)信息頭
l 多線程(使用 CLONE_THREAD,像NPTL的pthreads的那樣)
+ 在前臺(tái)進(jìn)程組
2.2. 平均負(fù)載數(shù)字的含義
load average: 1.17, 1.36, 0.63
拿其中1分鐘負(fù)載1.17來說,它表示1分鐘內(nèi)活躍的進(jìn)程數(shù)是1.17,單純看這個(gè)數(shù)字我們無法判斷究竟是負(fù)載高了還是低了。
評(píng)判之前我們需要先知道系統(tǒng)有幾個(gè)cpu,可以通過top
指令查看%Cpu
出現(xiàn)幾行,出現(xiàn)幾行表示有幾個(gè)cpu,或者直接查看/proc/cpuinfo
文件。
2.3. 平均負(fù)載的預(yù)測(cè)
以下內(nèi)容摘錄于“架構(gòu)師之路”公眾號(hào)。系統(tǒng)單核為單核cpu
1)1分鐘Load>5,5分鐘Load<1,15分鐘Load<1:短期內(nèi)繁忙,中長(zhǎng)期空閑,初步判斷是一個(gè)“抖動(dòng)”或者是“擁塞前兆”
2)1分鐘Load>5,5分鐘Load>1,15分鐘Load<1:短期內(nèi)繁忙,中期內(nèi)緊張,很可能是一個(gè)“擁塞的開始”
3)1分鐘Load>5,5分鐘Load>5,15分鐘Load>5:短中長(zhǎng)期都繁忙,系統(tǒng)“正在擁塞”
4)1分鐘Load<1,5分鐘Load>1,15分鐘Load>5:短期內(nèi)空閑,中長(zhǎng)期繁忙,不用緊張,系統(tǒng)“擁塞正在好轉(zhuǎn)”
2.4. 平均負(fù)載多少合理
一般來說,當(dāng)平均負(fù)載高于cpu數(shù)量70%的時(shí)候,負(fù)載就有點(diǎn)高了,應(yīng)該要排查下原因。
推薦的方法,還是通過監(jiān)控系統(tǒng)把平均負(fù)載給監(jiān)控起來,然后根據(jù)大量的歷史數(shù)據(jù)來衡量平均負(fù)載為多少是合理的。
3. 平均負(fù)載與CPU使用率的關(guān)系
我們知道平均負(fù)載指定的是單位時(shí)間內(nèi)活躍的進(jìn)程數(shù)
,不僅包括正在使用CPU的進(jìn)程,還包括等待CPU和等待IO的進(jìn)程。
顯然平均負(fù)載和CPU使用率沒有必然的關(guān)系,它們之間的關(guān)系如下所示:
- CPU密集型進(jìn)程,使用大量CPU會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的;
- I/O密集型進(jìn)程,等待I/O也會(huì)導(dǎo)致平均負(fù)載升高,但是CPU使用率卻不一定高;
- 大量等待CPU的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)的CPU使用率也會(huì)比較高。