Linux
系統中,平均負載是指單位時間內,處於可運行狀態和不可中斷狀態的進程數。它不僅包括了正在使用CPU
的進程,也包括處於不可打斷的睡眠狀態的進程—它們是在等待其它系統資源如磁盤 I/O
等的進程。而CPU
使用率,是單位時間內CPU
繁忙情況的統計,跟平均負載並不一定完全對應。
有諸多方式監測系統平均負載,比如最常用的uptime
和top
工具:
uptime
命令
uptime
會顯示系統運行時間、用戶數量及平均負載:
$ uptime
20:53:21 up 2:19, 3 users, load average: 0.07, 0.02, 0.00
平均負載的數字從左到右的含義依次爲:
- 最近 1 分鐘的平均負載爲 0.07
- 最近 5 分鐘的平均負載爲 0.02
- 最近 15 分鐘的平均負載爲 0.00
top
命令
top
命令可以實時的顯示Linux
系統的運行狀態:
$ top
下面是系統進程狀態的顯示:
top - 21:01:32 up 2:27, 2 users, load average: 0.03, 0.02, 0.00
Tasks: 261 total, 1 running, 190 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 1.5 sy, 0.0 ni, 97.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8144440 total, 5453688 free, 939500 used, 1751252 buff/cache
KiB Swap: 7810044 total, 7810044 free, 0 used. 6794636 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5834 f1dev 20 0 610168 107712 78048 S 1.7 1.3 0:04.87 chrome
2150 f1dev 20 0 1190912 116464 81708 S 1.0 1.4 0:14.88 compiz
5801 f1dev 20 0 771976 158536 113124 S 1.0 1.9 0:07.18 chrome
第一行的隊列信息和uptime
命令的輸出完全一致。
系統平均負載和CPU
核心數的關係
可以使用nproc
,lscpu
或者grep
命令查看系統中的處理器數量:
$ nproc
2
或者
$ lscpu
或者
$ grep 'model name' /proc/cpuinfo | wc -l
2
假設系統負載如下:
$ uptime
20:53:21 up 2:19, 3 users, load average: 1.00, 0.40, 3.35
如果一個單CPU
系統上表示在過去一分鐘內系統剛好滿載運行;在5分鐘內CPU
有 60%處於空閒狀態;而在15分鐘內,有235%的超載。
如果是在一個雙核系統中表示在過去一分鐘內系統有一個CPU
處於完全空閒狀態,另一個CPU
被使用;在5分鐘內,CPU
平均160% 處於空閒狀態;而在15分鐘內,有135%的超載,也就是說最近的 15 分鐘平均有1.35個進程等待CPU
時間。
平均負載案例分析
首先安裝stress
和sysstat
工具:
# stress:一個Linux系統壓力測試工具。
# sysstat:監控和分析系統的性能工具,包括mpstat(cpu詳細信息)、pidstat(進程性能分析)命令、iostat等。
$ sudo apt install stress sysstat
同一個Linux
系統打開三個終端,在第一終端模擬CPU
使用率100%場景:
$ stress --cpu 1 --timeout 600
stress: info: [6684] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
第二個終端運行uptime
:
# -d 參數表示高亮顯示變化的區域
$ watch -d uptime
21:40:12 up 3:06, 4 users, load average: 1.00, 0.50, 0.20
在第三個終端運行 mpstat
查看 CPU
使用率的變化:
# -P ALL 表示監控所有 CPU,後面數字 5 表示間隔 5 秒後輸出一組數據
$ mpstat -P ALL 5
21時40分01秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
21時40分06秒 all 50.45 0.30 0.50 0.00 0.00 0.00 0.00 0.00 0.00 48.75
21時40分06秒 0 100.00 0.60 0.60 0.00 0.00 0.00 0.00 0.00 0.00 4.40
21時40分06秒 1 6.02 0.00 0.60 0.00 0.00 0.00 0.00 0.00 0.00 93.37
從終端二看到1分鐘的平均負載會慢慢增加到1.00;終端三正好有一個CPU
使用率爲100%,但它的iowait
只有0,說明平均負載的升高正是由於CPU
使用率的升高。
那麼到底是哪個進程導致CPU
使用率爲100%,可以使用top
命令來或使用pidstat
命令來查看:
# 間隔 5 秒後輸出一組數據
$ pidstat -u 5 1
Average: UID PID %usr %system %guest %CPU CPU Command
Average: 1000 6685 100.00 0.00 0.00 99.60 - stress
從這裏可以明顯看到,stress
進程的 CPU
使用率爲 100%。