怎麼理解平均負載

uptime查看系統負載

$ uptime
17:43  up 13 days,  6:02, 2 users, load averages: 2.72 1.85 1.79

17:43 // 當前時間
up 13 days, 6:02 // 系統運行時間
2 users // 正在登陸的用戶

最後三個數據:1分鐘、5分鐘、15分鐘的平均負載

平均負載

平均負載的含義

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

  • 可運行狀態對的進程。正在使用CPU或者正在等待CPU的進程,也是常用ps命令看到處於R狀態(Running或Runnable)進程
  • 不可中斷的進程。正處於內核態關鍵流程中的進程,並且這些流程是不可打斷的,比如最常見的等待硬件設備的I/O響應。也是我們在ps命令中看到的D狀態(Uniterruptible Sleep,也成爲Disk Sleep)的進程

比如:當一個進程向磁盤讀寫數據時,爲了保證數據的一致性,在得到磁盤迴復前,它是不能被其他進程或者中斷打斷的,這個進程就處於不可中斷狀態。如果此時進程被打斷了,就容易出現磁盤數據和進程數據不一致的問題。
所以,不可中斷狀態實際上是系統對進程和硬件設備的一種保護機制

總結

簡單理解,平均負載其實就是平均活躍進程數。平均活躍進程數,直觀上理解就是單位時間內的活躍進程數,但它實際上是活躍進程數的指數衰減平均值。“指數衰減平均值”是系統一種更快速的計算方式,可以直接當成活躍進程數的平均值就可以。

舉例說明

既然平均的是活躍進程數,最理想的,就是CPU上都剛好運行一個進程,每個CPU都得到了充分利用。當平均負載爲2時,意味着什麼?

  • 在只有2個CPU的系統上,意味着所有的CPU都剛好被完全佔用
  • 在4個CPU系統上,意味着CPU有 50%的空閒
  • 在只有1個CPU的系統上,以爲則有一半的進程競爭不到CPU

平均負載爲多少時合理

平均負載最理性的情況等於CPU個數。所以評判平均負載時,首先要知道系統有幾個CPU,可以通過top命令或者從文件/proc/cpuinfo中讀取:

$ grep 'model name’ /proc/cpuinfo |wc -l

系統的負載趨勢

三個不同時間間隔的平均值,提供了系統負載情況的發展趨勢

  • 如果1分鐘、5分鐘、15分鐘的三個值進本形同,或者性差不大,說明系統負載很平穩
  • 如果1分鐘的值遠小於15分鐘的值,說明系統最近一分鐘的負載在減少,而過去15分鐘內的負載卻很大;反之亦然
    如果1分鐘的平均負載接近或超過CPU的個數,意味着新正在發上裹在問題,需要分析哪裏導致的問題並優化。
    當平均負載高於CPU數量70%的時候,應該分析排查負載高的問題。一旦負載過高,就可能導致進程響應變慢,進而影響服務的正常功能。

平均負載與CPU使用率

既然平均敷在代表是活躍進程數,那平均負載高了,就意味着CPU使用率高嗎?
平均負載的含義是指單位時間內,處於可運行狀態和不可中斷狀態的進程數。所以它不僅包括了正在使用的CPU今晨個,還包括等待CPU和等待I/O的進程。
CPU使用率是單位時間內CPU繁忙情況的統計,跟平均負載並不一定完全對應:

  • CPU密集型進程,使用大量CPU會導致平均負載升高,此時兩者是一致的;
  • I/O密集型進程,等待I/O也會導致平均負載升高,但CPU使用率不一定很高
  • 大量等待CPU的進程調度也會導致平均負載升高,此時CPU使用率也會比較高

常用觀察工具使用

uptime:觀察平均負載變化
mpstat:常用的多核CPU性能分析工具,用來實時查看每個CPU的性能指標,以及所有CPU的平均指標
pidstat:常用的進程性能分析工具,用來實時查看進程的CPU、內存、I/O以及上下文切換等性能指標
使用方式:

	# -d 參數表示高亮顯示變化區域
	$ watch -d uptime
    # -P ALL 表示監控所有 CPU,後面數字 5 表示間隔 5 秒後輸出一組數據
    $ 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
    
    # %usr:用戶空間CPU佔比
    # %sys:系統調用CPU佔比
    # %iowait:io等待CPU佔比
    # 間隔 5 秒後輸出一組數據
    $ 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章