Linux性能分析:理解系統平均負載

Linux系統中,平均負載是指單位時間內,處於可運行狀態和不可中斷狀態的進程數。它不僅包括了正在使用CPU的進程,也包括處於不可打斷的睡眠狀態的進程—它們是在等待其它系統資源如磁盤 I/O 等的進程。而CPU使用率,是單位時間內CPU繁忙情況的統計,跟平均負載並不一定完全對應。
有諸多方式監測系統平均負載,比如最常用的uptimetop工具:

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核心數的關係

可以使用nproclscpu或者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時間。

平均負載案例分析

首先安裝stresssysstat工具:

# 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%。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章