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