平均負(fù)載
- 平均負(fù)載:?jiǎn)挝粫r(shí)間內(nèi)解总,系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù)肉盹,和 CPU 使用率并沒(méi)有直接關(guān)系妻导。
- 可運(yùn)行狀態(tài)的進(jìn)程:是指正在使用 CPU 或者正在等待 CPU 的進(jìn)程,也就是我們常用 ps 命令看到的欧引,處于 R 狀態(tài)(Running 或 Runnable)的進(jìn)程频伤。
- 不可中斷狀態(tài)的進(jìn)程:正處于內(nèi)核態(tài)關(guān)鍵流程中的進(jìn)程,并且這些流程是不可打斷的芝此,比如最常見(jiàn)的是等待硬件設(shè)備的 I/O 響應(yīng)憋肖,也就是我們?cè)?ps 命令中看到的 D 狀態(tài)(Uninterruptible Sleep,也稱為 Disk Sleep)的進(jìn)程婚苹。
怎么判斷系統(tǒng)負(fù)載高岸更?
舉一個(gè)例子,加入我們?cè)谝粋€(gè) 2core cpu 的機(jī)器上看到過(guò)去 1 分鐘膊升,5 分鐘怎炊,15 分鐘的平均負(fù)載是load average: 2.78, 0.40, 6.38
,則說(shuō)明系統(tǒng)在過(guò)去一分鐘內(nèi)有 78% 的超載廓译,過(guò)去十分鐘有 438% 的超載评肆,但整體負(fù)載是在降低的。
一般來(lái)說(shuō)非区,當(dāng)平均負(fù)載高于 cpu 數(shù)量 70% 的時(shí)間瓜挽,建議就要分析系統(tǒng)負(fù)載高的問(wèn)題了。
不過(guò)征绸,要判斷系統(tǒng)的平均負(fù)載久橙,得先知道系統(tǒng)有幾個(gè) cpu,可以使用如下命令獲裙艿 :
grep 'model name' /proc/cpuinfo | wc -l
平均負(fù)載與 cpu 使用率的關(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ì)比較高欲低。
如何分析平均負(fù)載
工具介紹
yum install stress sysstat -y
# sysstat 包含了常用的 Linux 性能工具,用來(lái)監(jiān)控和分析系統(tǒng)的性能畜晰。
- stress: 壓測(cè)工具砾莱,模擬日常高負(fù)載的場(chǎng)景。
- 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)峭范。
cpu 密集型場(chǎng)景
- 窗口 1
# 模擬兩個(gè) cpu 被吃滿的場(chǎng)景
stress --cpu 2 --timeout 600
- 窗口 2
# 持續(xù)關(guān)注平均負(fù)載的變化情況
watch -d uptime
08:35:27 up 231 days, 18:13, 5 users, load average: 2.19, 1.36, 0.77
- 窗口 3
# 使用 mpstat 查看 cpu 使用率的變化情況
# -P ALL 表示監(jiān)控所有cpu财松,間隔 5s輸出一次
mpstat -P ALL 5
...
08:31:54 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:31:59 AM all 14.62 0.00 1.45 0.04 0.00 0.24 0.00 0.00 0.00 83.65
08:31:59 AM 0 2.45 0.00 1.22 0.20 0.00 0.00 0.00 0.00 0.00 96.12
08:31:59 AM 1 1.41 0.00 1.20 0.00 0.00 1.41 0.00 0.00 0.00 95.98
08:31:59 AM 2 3.84 0.00 1.41 0.00 0.00 0.61 0.00 0.00 0.00 94.14
08:31:59 AM 3 1.81 0.00 1.41 0.00 0.00 0.80 0.00 0.00 0.00 95.98
08:31:59 AM 4 1.21 0.00 1.21 0.00 0.00 0.20 0.00 0.00 0.00 97.38
08:31:59 AM 5 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:31:59 AM 6 3.64 0.00 2.83 0.00 0.00 0.20 0.00 0.00 0.00 93.33
08:31:59 AM 7 3.21 0.00 1.40 0.20 0.00 0.20 0.00 0.00 0.00 94.99
08:31:59 AM 8 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
08:31:59 AM 9 1.80 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 97.39
08:31:59 AM 10 2.43 0.00 1.42 0.00 0.00 0.00 0.00 0.00 0.00 96.15
08:31:59 AM 11 1.81 0.00 2.62 0.00 0.00 0.20 0.00 0.00 0.00 95.37
08:31:59 AM 12 2.23 0.00 2.43 0.00 0.00 0.00 0.00 0.00 0.00 95.34
08:31:59 AM 13 2.01 0.00 1.81 0.00 0.00 0.00 0.00 0.00 0.00 96.18
08:31:59 AM 14 2.62 0.00 1.61 0.00 0.00 0.20 0.00 0.00 0.00 95.56
08:31:59 AM 15 2.21 0.00 1.81 0.20 0.00 0.00 0.00 0.00 0.00 95.78
...
可以看到 cpu5 和 9 使用率達(dá)到了 100%。
- 窗口4
# 使用 pidstat 查看
# 間隔5秒后輸出一組數(shù)據(jù)
pidstat -u 5 1
08:32:50 AM UID PID %usr %system %guest %wait %CPU CPU Command
...
Average: 999 2896361 0.20 0.00 0.00 0.00 0.20 - argocd-server
Average: 0 3246750 100.00 0.00 0.00 0.00 100.00 - stress
Average: 0 3246751 100.00 0.00 0.00 0.00 100.00 - stress
Average: 0 3248088 0.00 0.20 0.00 0.00 0.20 - kruise-controll
...
可以看到是 stress占滿了 cpu
io密集型場(chǎng)景
# 模擬高 io 場(chǎng)景
stress -i 1 --timeout 600
窗口 2
watch -d uptime
Every 2.0s: uptime VM-167-17-tencentos: Sat Dec 30 06:30:52 2023
06:30:52 up 233 days, 16:08, 5 users, load average: 2.38, 1.33, 1.03
可以看到纱控,通過(guò)對(duì) io 進(jìn)行壓測(cè)辆毡,也會(huì)導(dǎo)致系統(tǒng)負(fù)載的升高
窗口3
# 顯示所有CPU的指標(biāo),并在間隔5秒輸出一組數(shù)據(jù)
$ mpstat -P ALL 5 1
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 29.8 62.3 0.00 0.43 0.00 0.00 0.00 7.94
13:41:33 1 0.00 0.00 0.81 0.20 0.00 0.00 0.00 0.00 0.00 98.99
可以看到甜害,cpu 使用率的升高是由于比較高的 io wait 導(dǎo)致舶掖。
窗口 4
pidstat -u 5 1
06:33:57 AM UID PID %usr %system %guest %wait %CPU CPU Command
...
06:34:02 AM 0 3274695 0.00 0.20 0.00 0.00 0.20 7 kworker/7:0-events
06:34:02 AM 0 3279743 0.00 78.04 0.00 0.00 78.04 2 stress
06:34:02 AM 0 3280943 0.00 0.20 0.00 0.00 0.20 5 kworker/5:0-events
...
ok,至此尔店,我們已經(jīng)找到問(wèn)題在哪里了
大量進(jìn)程場(chǎng)景
# 模擬多進(jìn)程場(chǎng)景眨攘,16core 機(jī)器模擬 32 進(jìn)程場(chǎng)景
stress -c 32 --timeout 600
窗口 1
watch -d uptime
Every 2.0s: uptime VM-167-17-tencentos: Sat Dec 30 06:52:53 2023
06:52:53 up 233 days, 16:30, 5 users, load average: 30.82, 6.79, 1.34
可以看到,過(guò)去 1 分鐘系統(tǒng)已經(jīng)嚴(yán)重超載
窗口 2
mpstat -P ALL 5 1
06:51:34 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:51:39 AM all 99.10 0.00 0.86 0.00 0.00 0.04 0.00 0.00 0.00 0.00
06:51:39 AM 0 99.40 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 1 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 2 99.00 0.00 0.80 0.00 0.00 0.20 0.00 0.00 0.00 0.00
06:51:39 AM 3 97.80 0.00 2.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 4 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 5 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 6 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 7 99.40 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 8 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 9 99.40 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 10 98.20 0.00 1.80 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 11 98.00 0.00 1.80 0.00 0.00 0.20 0.00 0.00 0.00 0.00
06:51:39 AM 12 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 13 99.60 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:51:39 AM 14 98.60 0.00 1.20 0.00 0.00 0.20 0.00 0.00 0.00 0.00
06:51:39 AM 15 98.40 0.00 1.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00
如上所示嚣州,16 核的 cpu 也被全部占滿了
窗口4
pidstat -u 5 1
06:51:52 AM UID PID %usr %system %guest %wait %CPU CPU Command
...
06:51:57 AM 0 3349072 45.65 0.20 0.00 53.95 45.85 2 stress
06:51:57 AM 0 3349073 51.98 0.00 0.00 47.83 51.98 3 stress
06:51:57 AM 0 3349074 46.25 0.00 0.00 53.16 46.25 7 stress
06:51:57 AM 0 3349075 43.68 0.00 0.00 55.93 43.68 13 stress
06:51:57 AM 0 3349076 49.41 0.20 0.00 50.20 49.60 2 stress
06:51:57 AM 0 3349077 44.47 0.00 0.00 55.14 44.47 12 stress
06:51:57 AM 0 3349078 47.63 0.00 0.00 51.98 47.63 14 stress
06:51:57 AM 0 3349079 44.86 0.00 0.00 54.74 44.86 9 stress
06:51:57 AM 0 3349080 46.44 0.00 0.00 53.16 46.44 13 stress
06:51:57 AM 0 3349081 43.68 0.00 0.00 55.93 43.68 12 stress
06:51:57 AM 0 3349082 55.34 0.20 0.00 44.27 55.53 7 stress
06:51:57 AM 0 3349083 47.43 0.00 0.00 52.17 47.43 14 stress
06:51:57 AM 0 3349084 52.37 0.00 0.00 46.84 52.37 15 stress
06:51:57 AM 0 3349085 52.17 0.00 0.00 47.04 52.17 6 stress
06:51:57 AM 0 3349086 44.07 0.00 0.00 55.34 44.07 10 stress
06:51:57 AM 0 3349087 44.66 0.00 0.00 55.14 44.66 4 stress
06:51:57 AM 0 3349088 41.50 0.00 0.00 57.91 41.50 10 stress
06:51:57 AM 0 3349089 43.08 0.00 0.00 56.52 43.08 5 stress
06:51:57 AM 0 3349090 52.57 0.00 0.00 46.84 52.57 15 stress
06:51:57 AM 0 3349091 56.52 0.00 0.00 43.08 56.52 6 stress
06:51:57 AM 0 3349092 49.21 0.20 0.00 50.40 49.41 1 stress
06:51:57 AM 0 3349093 43.48 0.00 0.00 56.13 43.48 11 stress
06:51:57 AM 0 3349094 40.32 0.00 0.00 59.29 40.32 8 stress
06:51:57 AM 0 3349095 59.09 0.20 0.00 40.32 59.29 3 stress
06:51:57 AM 0 3349096 43.68 0.00 0.00 55.93 43.68 0 stress
06:51:57 AM 0 3349097 51.98 0.00 0.00 47.63 51.98 8 stress
06:51:57 AM 0 3349098 50.20 0.00 0.00 49.41 50.20 13 stress
06:51:57 AM 0 3349099 43.08 0.00 0.00 56.52 43.08 5 stress
06:51:57 AM 0 3349100 53.16 0.20 0.00 46.25 53.36 0 stress
06:51:57 AM 0 3349101 50.20 0.00 0.00 49.21 50.20 1 stress
06:51:57 AM 0 3349102 47.43 0.00 0.00 51.98 47.43 9 stress
06:51:57 AM 0 3349103 46.25 0.00 0.00 53.56 46.25 11 stress
06:51:57 AM 0 3351355 0.00 0.20 0.00 0.40 0.20 10 pidstat
總結(jié)
通過(guò)上面的分析我們可以看出鲫售,單純的看平均負(fù)載我們并不能快速的獲取到系統(tǒng)的瓶頸到底在哪里,同時(shí)也要考慮到该肴,是 cpu 密集型任務(wù)導(dǎo)致的龟虎?還是 io 密集型任務(wù)導(dǎo)致的?可以在實(shí)際遇到的時(shí)候結(jié)合mpstat
,pidstat
等工具沙庐,結(jié)合實(shí)際情況進(jìn)行分析。