02-基礎篇:到底應該怎麼理解“平均負載”
阿新 • • 發佈:2021-11-08
引子
每次發現系統變慢時,我們通常做的第一件事,就是執行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