1. 程式人生 > 其它 >02-基礎篇:到底應該怎麼理解“平均負載”

02-基礎篇:到底應該怎麼理解“平均負載”





引子

每次發現系統變慢時,我們通常做的第一件事,就是執行top或者uptime命令,來了解系統的負載情況


uptime命令
[root@local_sa_192-168-1-6 ~]# uptime
15:58:04 up 3 min,  3 users,  load average: 0.20, 0.46, 0.23

輸出結果解釋
#15:58:04:    當前時間    
#up 3 min:    系統執行時間
#3 users:     當前登入系統的使用者數
#load average: 0.20, 0.46, 0.23:  過去1分鐘、5分鐘、15分鐘的平均負載(LoadAverage)




平均負載是什麼

【平均負載】是指單位時間內,系統處於【可執行狀態】和【不可中斷狀態】的平均程序數
也就是平均活躍程序數,它和 CPU 使用率並沒有直接關係


【可執行狀態】的程序,是指正在使用CPU或者正在等待CPU的程序,也就是我們常用top命令看到的
處於R狀態(Running或Runnable)的程序


【不可中斷狀態】的程序則是正處於核心態關鍵流程中的程序,並且這些流程是不可打斷的
比如最常見的是等待硬體裝置的I/O響應
也就是我們在top命令中看到的D狀態(Uninterruptible Sleep,也稱為Disk Sleep)的程序

比如,當一個程序向磁碟讀寫資料時,為了保證資料的一致性,在得到磁盤迴復前
它是不能被其他程序或者中斷打斷的
這個時候的程序就處於不可中斷狀態
如果此時的程序被打斷了,就容易出現磁碟資料與程序資料不一致的問題
所以,不可中斷狀態實際上是系統對程序和硬體裝置的一種保護機制

因此,你可以簡單理解為,【平均負載其實就是平均活躍程序數】

既然平均的是活躍程序數,那麼最理想的,就是每個CPU上都剛好執行著一個程序,
這樣每個CPU都得到了充分利用。比如當平均負載為2時,意味著什麼呢?
1.在只有2 個CPU的系統上,意味著所有的CPU都剛好被完全佔用
2.在4個CPU的系統上,意味著CPU有50%的空閒
3.而在只有1個CPU的系統中,則意味著有一半的程序競爭不到CPU



平均負載為多少時合理

我們知道,平均負載最理想的情況是等於CPU個數
所以在評判平均負載時,首先你要知道系統有幾個CPU(cpu邏輯個數)
可以通過top命令或者從檔案/proc/cpuinfo中讀取

# /proc/cpuinfo
[root@local_sa_192-168-1-6 ~]# grep "model name" /proc/cpuinfo
model name	: QEMU Virtual CPU version (cpu64-rhel6)
model name	: QEMU Virtual CPU version (cpu64-rhel6)
[root@local_sa_192-168-1-6 ~]# grep "model name" /proc/cpuinfo |wc -l
2

# top --> 按數字 1
[root@local_sa_192-168-1-6 ~]# top
top - 16:21:10 up 26 min,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 179 total,   1 running, 178 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st


有了CPU個數,我們就可以判斷出,當平均負載比CPU個數還大的時候,系統已經出現了過載

不過,且慢,我們在例子中可以看到,平均負載有三個數值,到底該參考哪一個呢?
【實際上,都要看。三個不同時間間隔的平均值,其實給我們提供了,分析系統負載趨勢的資料來源,讓我們能更全面、更立體地理解目前的負載狀況】

1.如果1分鐘、5分鐘、15分鐘的三個值基本相同,或者相差不大,那就說明系統負載很平穩
2.如果1分鐘的值遠小於15分鐘的值,就說明系統最近1分鐘的負載在減少,而過去15分鐘內卻有很大的負載
3.如果1分鐘的值遠大於15分鐘的值,就說明最近1分鐘的負載在增加
  這種增加有可能只是臨時性的,也有可能還會持續增加下去,所以就需要持續觀察
4.一旦1分鐘的平均負載接近或超過了CPU的個數,就意味著系統正在發生過載的問題
  這時就得分析調查是哪裡導致的問題,並要想辦法優化了
  
  
舉個例子,假設我們在一個單CPU系統上看到平均負載為1.73,0.60,7.98
那麼說明在過去1分鐘內,系統有73%的超載,
而在15分鐘內,有698%的超載,
從整體趨勢來看,系統的負載在降低(15*73=1095)


在實際生產環境中,平均負載多高時,需要我們重點關注呢?
【當平均負載高於CPU數量70%的時候】
就應該分析排查負載高的問題了,一旦負載過高,就可能導致程序響應變慢,進而影響服務的正常功能

但70%這個數字並不是絕對的
最推薦的方法,還是把系統的平均負載監控起來,
然後根據更多的歷史資料,判斷負載的變化趨勢。
當發現負載有明顯升高趨勢時,比如說負載翻倍了,你再去做分析和調查



平均負載與CPU使用率區別

平均負載是指單位時間內,處於可執行狀態和不可中斷狀態的程序數
所以,它不僅包括了正在使用CPU的程序,還包括等待CPU和等待I/O的程序


CPU使用率,是單位時間內CPU繁忙情況的統計,跟平均負載並不一定完全對應
比如
1.CPU密集型程序,使用大量CPU會導致平均負載升高,此時這兩者是一致的
2.I/O密集型程序,等待I/O也會導致平均負載升高,但CPU使用率不一定很高
3.大量等待CPU的程序排程也會導致平均負載升高,此時的CPU使用率也會比較高




平均負載案例分析

準備工作

以三個示例分別來看這三種情況,並用iostat、mpstat、pidstat等工具,找出平均負載升高的根源

機器配置:2CPU,4GB記憶體 centos7.6

預先安裝 stress 和 sysstat 包
[root@local_sa_192-168-1-6 ~]# rpm -qa stress
stress-1.0.4-16.el7.x86_64
[root@local_sa_192-168-1-6 ~]# rpm -qa sysstat
sysstat-11.7.3-2.el8.x86_64

stress 是一個Linux系統壓力測試工具,這裡用作異常程序模擬平均負載升高的場景

sysstat 包含了常用的Linux效能工具,用來監控和分析系統的效能。
案例中會用到這個包的兩個命令mpstat和pidstat

mpstat 是一個常用的多核CPU效能分析工具,用來實時檢視每個CPU的效能指標,以及所有CPU的平均指標
pidstat 是一個常用的程序效能分析工具,用來實時檢視程序的CPU、記憶體、I/O以及上下文切換等效能指標


場景一:CPU 密集型程序

1.第一個終端執行 stress 命令,模擬一個CPU 使用率 100% 的場景

[root@local_sa_192-168-1-6 ~]# stress --cpu 1 --timeout 600
stress: info: [13051] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

2.在第二個終端執行 uptime 檢視平均負載的變化情況

# watch動態顯示數值變化
# -d 高亮顯示變化的區域
[root@local_sa_192-168-1-6 ~]# watch -d uptime
17:07:51 up  1:13,  3 users,  load average: 1.00, 0.83, 0.46

3.第三個終端執行 mpstat 檢視CPU使用率的變化情況

# -P ALL 表示監控所有cpu,後面的數字5表示間隔5秒輸出一組資料
[root@local_sa_192-168-1-6 ~]# mpstat -P ALL 5
17時08分12秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時08分17秒  all   50.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   50.00
17時08分17秒    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時08分17秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

4.檢視原因

從終端二中可以看到,1分鐘的平均負載會慢慢增加到1.00

從終端三中還可以看到,正好有一個CPU的使用率為100%,但它的iowait只有0
這說明,平均負載的升高正是由於CPU使用率為100%

那麼,到底是哪個程序導致了CPU使用率為100%呢?
可以使用 pidstat 來查詢
# pidstat 檢視程序佔用的系統資源
# 間隔5秒後輸出一組資料
# -u 檢視cpu資料
[root@local_sa_192-168-1-6 ~]# pidstat -u 5 1
Linux 3.10.0-1160.31.1.el7.x86_64 (local_sa_192-168-1-6) 	2021年11月08日 	_x86_64_	(2 CPU)

17時12分48秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
17時12分53秒     0       398    0.00    0.20    0.00    0.20    0.20     0  xfsaild/dm-0
17時12分53秒     0     13867   99.80    0.00    0.00    0.00   99.80     1  stress
17時12分53秒     0     13959    0.00    0.20    0.00    0.00    0.20     0  pidstat

平均時間:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均時間:     0       398    0.00    0.20    0.00    0.20    0.20     -  xfsaild/dm-0
平均時間:     0     13867   99.80    0.00    0.00    0.00   99.80     -  stress
平均時間:     0     13959    0.00    0.20    0.00    0.00    0.20     -  pidstat

從這裡可以明顯看到,stress 程序的CPU使用率為100%


場景二:I/O密集型程序

1.第一個終端,執行 stress命令,模擬 I/O 壓力,即不停地執行sync

[root@local_sa_192-168-1-6 ~]# stress -i 1 --timeout 600
stress: info: [13986] dispatching hogs: 0 cpu, 1 io, 0 vm, 0 hdd

# 建議使用這條命令測試 centos系統
# 如果上一條命令不能模擬出I/O壓力,那麼使用這條命令
[root@local_sa_192-168-1-6 ~]# stress-ng -i 1 --hdd 1 --timeout 600

2.第二個終端執行uptime檢視平均負載的變化情況

[root@local_sa_192-168-1-6 ~]# watch -d uptime
 17:18:32 up  1:24,  4 users,  load average: 2.06, 0.82, 0.58

3.第三個終端執行mpstat檢視CPU使用率的變化情況

[root@local_sa_192-168-1-6 ~]# mpstat -P ALL 5
[root@local_sa_192-168-1-6 ~]# mpstat -P ALL 5
Linux 3.10.0-1160.31.1.el7.x86_64 (local_sa_192-168-1-6) 	2021年11月08日 	_x86_64_	(2 CPU)

17時24分16秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時24分21秒  all    0.20    0.00    0.20   99.50    0.00    0.00    0.10    0.00    0.00    0.00
17時24分21秒    0    0.20    0.00    0.20   99.60    0.00    0.00    0.00    0.00    0.00    0.00
17時24分21秒    1    0.20    0.00    0.20   99.40    0.00    0.00    0.20    0.00    0.00    0.00

4.檢視

從終端二中可以看到,1分鐘的平均負載會慢慢增加到2.06
從終端三中可以看到,iowait高達99%,這說明,平均負載的升高是由於iowait的升高

那麼到底是哪個程序,導致iowait這麼高呢?用pidstat -d 5 1來查詢
# -d 檢視磁碟資料
[root@local_sa_192-168-1-6 ~]# pidstat -d 5 1
Linux 3.10.0-1160.31.1.el7.x86_64 (local_sa_192-168-1-6) 	2021年11月08日 	_x86_64_	(2 CPU)

17時31分54秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
17時31分59秒     0      1378      0.00      0.80      0.00       0  teamviewerd
17時31分59秒     0     14012      0.00      0.00      0.00     494  kworker/u4:2
17時31分59秒     0     14521      0.00  17333.33      0.00     496  stress-ng-hdd
17時31分59秒     0     14522      0.00      0.00      0.00     500  stress-ng-io

平均時間:   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
平均時間:     0      1378      0.00      0.80      0.00       0  teamviewerd
平均時間:     0     14012      0.00      0.00      0.00     494  kworker/u4:2
平均時間:     0     14521      0.00  17333.33      0.00     496  stress-ng-hdd
平均時間:     0     14522      0.00      0.00      0.00     500  stress-ng-io


從這裡可以看出 stress-ng 程序導致的


場景三:大量程序的場景

當系統中執行程序超出CPU執行能力時,就會出現等待CPU的程序

1.第一個終端,使用 stress,模擬的是 8 個程序

[root@local_sa_192-168-1-6 ~]# stress -c 8 --timeout 600

2.第二個終端執行uptime檢視平均負載的變化情況

[root@local_sa_192-168-1-6 ~]# watch -d uptime
17:38:15 up  1:44,  4 users,  load average: 4.68, 1.76, 1.11

3.第三個終端執行mpstat檢視CPU使用率的變化情況

[root@local_sa_192-168-1-6 ~]# mpstat -P ALL 5
Linux 3.10.0-1160.31.1.el7.x86_64 (local_sa_192-168-1-6) 	2021年11月08日 	_x86_64_	(2 CPU)

17時39分01秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時39分06秒  all   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時39分06秒    0   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17時39分06秒    1   99.80    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00

平均時間:  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
平均時間:  all   99.87    0.00    0.13    0.00    0.00    0.00    0.00    0.00    0.00    0.00
平均時間:    0   99.89    0.00    0.11    0.00    0.00    0.00    0.00    0.00    0.00    0.00
平均時間:    1   99.86    0.00    0.14    0.00    0.00    0.00    0.00    0.00    0.00    0.00

4.檢視

# 8個程序在爭搶2個CPU,每個程序等待CPU的時間(也就是程式碼塊中的%wait列)高達75%。
# 這些超出CPU計算能力的程序,最終導致CPU過載
[root@local_sa_192-168-1-6 ~]# pidstat -u 5 1
Linux 3.10.0-1160.31.1.el7.x86_64 (local_sa_192-168-1-6) 	2021年11月08日 	_x86_64_	(2 CPU)

17時40分44秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
17時40分49秒     0      1378    0.20    0.20    0.00    0.00    0.40     1  teamviewerd
17時40分49秒     0     14570   25.20    0.00    0.00   74.40   25.20     0  stress
17時40分49秒     0     14571   24.80    0.00    0.00   75.60   24.80     1  stress
17時40分49秒     0     14572   24.60    0.00    0.00   74.80   24.60     0  stress
17時40分49秒     0     14573   24.60    0.00    0.00   75.00   24.60     1  stress
17時40分49秒     0     14574   24.40    0.00    0.00   75.20   24.40     0  stress
17時40分49秒     0     14575   24.80    0.00    0.00   75.40   24.80     1  stress
17時40分49秒     0     14576   24.80    0.00    0.00   75.40   24.80     1  stress
17時40分49秒     0     14577   25.60    0.00    0.00   75.20   25.60     0  stress
17時40分49秒     0     14613    0.20    0.20    0.00    0.60    0.40     1  watch
17時40分49秒     0     14774    0.00    0.20    0.00    0.40    0.20     0  pidstat

平均時間:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均時間:     0      1378    0.20    0.20    0.00    0.00    0.40     -  teamviewerd
平均時間:     0     14570   25.20    0.00    0.00   74.40   25.20     -  stress
平均時間:     0     14571   24.80    0.00    0.00   75.60   24.80     -  stress
平均時間:     0     14572   24.60    0.00    0.00   74.80   24.60     -  stress
平均時間:     0     14573   24.60    0.00    0.00   75.00   24.60     -  stress
平均時間:     0     14574   24.40    0.00    0.00   75.20   24.40     -  stress
平均時間:     0     14575   24.80    0.00    0.00   75.40   24.80     -  stress
平均時間:     0     14576   24.80    0.00    0.00   75.40   24.80     -  stress
平均時間:     0     14577   25.60    0.00    0.00   75.20   25.60     -  stress
平均時間:     0     14613    0.20    0.20    0.00    0.60    0.40     -  watch
平均時間:     0     14774    0.00    0.20    0.00    0.40    0.20     -  pidstat


小結

平均負載提供了一個快速檢視系統整體效能的手段,反映了整體的負載情況。
但只看平均負載本身,我們並不能直接發現,到底是哪裡出現了瓶頸。
所以,在理解平均負載時,也要注意:
1.平均負載高有可能是CPU密集型程序導致的
2.平均負載高並不一定代表CPU使用率高,還有可能是I/O更繁忙了
3.當發現負載高的時候,你可以使用mpstat、pidstat等工具,輔助分析負載的來源

轉載請註明出處喲~ https://www.cnblogs.com/lichengguo