3.3. Red Hat Enterprise Linux 的特定資訊

在 Red Hat Enterprise Linux 下監控頻寬與 CPU 的使用狀態,需要用到 第2章 所討論過的工具;因此,如果您尚未閱讀該章節,請在繼續之前,先把它瀏覽一遍。

3.3.1. 在 Red Hat Enterprise Linux 上監控頻寬

正如 第 2.4.2 節 一節所提到的,要直接監控頻寬使用率不是件容易的事。然而,藉由檢視裝置層的數據,我們就可以大略得知系統是不是有頻寬不足的問題。

我們可以使用 vmstat 指令,檢視其中的 bibo欄位,以得知整體的裝置活動是否過於頻繁;除此之外,記下 siso 欄位的內容,也能讓您進一步得知有多少磁碟活動,是跟置換(swap)的 I/O 有關。

   procs                      memory    swap          io     system         cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id
 1  0  0      0 248088 158636 480804   0   0     2     6  120   120  10   3  87
        

以這個例子來說, bi 欄位顯示每秒有 2 個磁區寫入磁區裝置(通常是磁碟機),而 bo 欄位則顯示,每秒有 6 個磁區從磁區裝置讀出。我們也可以確定,這些動作跟記憶體置換無關,因為 siso 欄位指出,與置換有關的 I/O 速率都是每秒 0 位元(實際單位為千位元組 - Kbyte)。

藉由 iostat 指令,我們可以更進一步了解磁碟相關的活動:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (raptor.example.com)     07/21/2003

avg-cpu:  %user   %nice    %sys   %idle
           5.34    4.60    2.83   87.24

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
dev8-0            1.10         6.21        25.08     961342    3881610
dev8-1            0.00         0.00         0.00         16          0
        

這結果告訴我們裝置 8 (即 /dev/sda,第一個 SCSI 硬碟)每秒約處理 1 個 I/O 動作(tsp 欄位)。這裝置的大部分 I/O 動作都跟寫入有關(Blk_wrtn 欄位),每秒大約寫入 25 個磁區(Blk_wrtn/s 欄位)。

要知道更多詳情,可以用 iostat 指令的 -x 選項。

Linux 2.4.21-1.1931.2.349.2.2.entsmp (raptor.example.com)     07/21/2003

avg-cpu:  %user   %nice    %sys   %idle
           5.37    4.54    2.81   87.27

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz
/dev/sda    13.57   2.86  0.36  0.77   32.20   29.05    16.10    14.53    54.52
/dev/sda1    0.17   0.00  0.00  0.00    0.34    0.00     0.17     0.00   133.40
/dev/sda2    0.00   0.00  0.00  0.00    0.00    0.00     0.00     0.00    11.56
/dev/sda3    0.31   2.11  0.29  0.62    4.74   21.80     2.37    10.90    29.42
/dev/sda4    0.09   0.75  0.04  0.15    1.06    7.24     0.53     3.62    43.01
        

這一長串資料的上方,還包含了更多欄位。首先要注意的是,iostat 指令目前顯示的是每個分割區的資訊。您可以使用 df 指令,弄清掛載點與裝置名稱之間的關係,如此一來,您就可以看出,例如 /home/ 目錄到底佔據了多少工作量。

事實上,每行 iostat -x 指令所顯示的資訊都不只於此,我們把剛剛未印出的欄位列在下面(我們在每一行的前面加上了裝置一欄,方便您讀取):

Device:    avgqu-sz   await  svctm  %util
/dev/sda       0.24   20.86   3.80   0.43
/dev/sda1      0.00  141.18 122.73   0.03
/dev/sda2      0.00    6.00   6.00   0.00
/dev/sda3      0.12   12.84   2.68   0.24
/dev/sda4      0.11   57.47   8.94   0.17
        

在這例子中,值得注意的是 /dev/sda2 是系統的置換分割區;許多欄位都顯示 0.00,這表示這台電腦上,置換並未造成任何問題。

另一個值得注意的是 /dev/sda1,其數據非常特別:整體活動似乎很低,但為什麼平均 I/O 要求大小(avgrq-sz)、平均等待時間(await)、以及平均服務時間(svctm)的值遠大於其他呢?這是因為這個分割區包括了 /boot/ 目錄,是核心與初始虛擬磁碟(ramdisk)的所在地。當系統開機時,讀取 I/O(請注意只有rsec/srkB/s 欄位是非零值;通常寫入並不會發生)會讀取較多的磁區,拉長等待時間與服務時間。

您也可以使用 sar 指令,大略檢視長期的 I/O 數據。舉例來說,sar -b 會顯示一般的 I/O 報表:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (raptor.example.com)     07/21/2003

12:00:00 AM       tps      rtps      wtps   bread/s   bwrtn/s
12:10:00 AM      0.51      0.01      0.50      0.25     14.32
12:20:01 AM      0.48      0.00      0.48      0.00     13.32
…
06:00:02 PM      1.24      0.00      1.24      0.01     36.23
Average:         1.11      0.31      0.80     68.14     34.79
        

這畫面跟 iostat 的初始畫面很像,所有統計資料都以磁區裝置為主,分類列出。

另一個與 I/O 相關的報表,則可以使用 sar -d 產生:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (raptor.example.com)     07/21/2003

12:00:00 AM       DEV       tps    sect/s
12:10:00 AM    dev8-0      0.51     14.57
12:10:00 AM    dev8-1      0.00      0.00
12:20:01 AM    dev8-0      0.48     13.32
12:20:01 AM    dev8-1      0.00      0.00
…
06:00:02 PM    dev8-0      1.24     36.25
06:00:02 PM    dev8-1      0.00      0.00
Average:       dev8-0      1.11    102.93
Average:       dev8-1      0.00      0.00
        

這報告提供的是裝置訊息,但沒有那麼詳盡。

雖然沒有任何資料明確顯示某個匯流排或資料路徑的頻寬使用率,但我們可以藉由裝置的活動,間接得知匯流排的工作負荷。

3.3.2. 在 Red Hat Enterprise Linux 上監控 CPU 使用率

跟頻寬不同,監控 CPU 使用率就直接的多。從 GNOME 系統監控工具看出 CPU 的使用百分比,到 sar 的深入統計資料等,我們可以正確的看出是哪些程式正在使用 CPU,以及 CPU 的使用量為何。

在討論 GNOME 系統監控之前,我們已經在 第2章 中提過 top 指令,它能提供 CPU 使用率的深度資訊。底下是一台雙 CPU 工作站的 top 報告:

  9:44pm  up 2 days, 2 min,  1 user,  load average: 0.14, 0.12, 0.09
90 processes: 82 sleeping, 1 running, 7 zombie, 0 stopped
CPU0 states:  0.4% user,  1.1% system,  0.0% nice, 97.4% idle
CPU1 states:  0.5% user,  1.3% system,  0.0% nice, 97.1% idle
Mem:  1288720K av, 1056260K used,  232460K free,       0K shrd,  145644K buff
Swap:  522104K av,       0K used,  522104K free                  469764K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
30997 ed        16   0  1100 1100   840 R     1.7  0.0   0:00 top
 1120 root       5 -10  249M 174M 71508 S <   0.9 13.8 254:59 X
 1260 ed        15   0 54408  53M  6864 S     0.7  4.2  12:09 gnome-terminal
  888 root      15   0  2428 2428  1796 S     0.1  0.1   0:06 sendmail
 1264 ed        15   0 16336  15M  9480 S     0.1  1.2   1:58 rhn-applet-gui
    1 root      15   0   476  476   424 S     0.0  0.0   0:05 init
    2 root      0K   0     0    0     0 SW    0.0  0.0   0:00 migration_CPU0
    3 root      0K   0     0    0     0 SW    0.0  0.0   0:00 migration_CPU1
    4 root      15   0     0    0     0 SW    0.0  0.0   0:01 keventd
    5 root      34  19     0    0     0 SWN   0.0  0.0   0:00 ksoftirqd_CPU0
    6 root      34  19     0    0     0 SWN   0.0  0.0   0:00 ksoftirqd_CPU1
    7 root      15   0     0    0     0 SW    0.0  0.0   0:05 kswapd
    8 root      15   0     0    0     0 SW    0.0  0.0   0:00 bdflush
    9 root      15   0     0    0     0 SW    0.0  0.0   0:01 kupdated
   10 root      25   0     0    0     0 SW    0.0  0.0   0:00 mdrecoveryd
          

第一個與 CPU 有關的資訊,出現在第一行:平均負載(load average)。平均負載反應了系統上可執行程序的平均數目。平均負載通常列出三組數字,分別代表前 1、5、15分鐘的負載。本例的數據顯示,伺服器並不忙。

嚴格來說,第二行跟 CPU 使用率無關;但卻有間接的關係。它會顯示執行中行程的數目(在這例子中,只有一個 -- 記得這個數目,在本例中是有特別含意的)。在 CPU 能力吃緊的系統上,執行中行程數目是個很好的指標。

接下來兩行分別顯示了系統上兩顆 CPU 的目前使用率。使用率數據顯示出使用者程序、系統程序所佔用的處理器週期比例。然後是更改過優先順序的程序所佔用的處理器使用量;最後則是閒置時間。

再往下的資料都與程序有關,我們可以發現,最耗 CPU 資源的正是 top 指令自己。這也告訴我們,正在執行的那個程序,就是 top 本身,像自拍一樣的監控自己的使用量;不然的話,系統應該是閒置的。

提示提示
 

要記得非常重要的一點:那就是系統監控程式本身也會耗用系統資源,影響您的數據。只要是軟體的監控程式,都或多或少有這樣的問題。

要知道更多 CPU 使用率的資訊,我們得換個工具。如果我們看看 vmstat 指令,我們就會得到同一台測試系統上,稍微不同的資訊。

   procs                      memory    swap          io     system         cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id
 1  0  0      0 233276 146636 469808   0   0     7     7   14    27  10   3  87
 0  0  0      0 233276 146636 469808   0   0     0     0  523   138   3   0  96
 0  0  0      0 233276 146636 469808   0   0     0     0  557   385   2   1  97
 0  0  0      0 233276 146636 469808   0   0     0     0  544   343   2   0  97
 0  0  0      0 233276 146636 469808   0   0     0     0  517    89   2   0  98
 0  0  0      0 233276 146636 469808   0   0     0    32  518   102   2   0  98
 0  0  0      0 233276 146636 469808   0   0     0     0  516    91   2   1  98
 0  0  0      0 233276 146636 469808   0   0     0     0  516    72   2   0  98
 0  0  0      0 233276 146636 469808   0   0     0     0  516    88   2   0  97
 0  0  0      0 233276 146636 469808   0   0     0     0  516    81   2   0  97
        

這個例子中,我們使用的指令是 vmstat 1 10 指令,以每秒為間隔,讀取資訊十次。首先,跟 CPU 相關的資訊(ussy、以及us欄位)看起來跟 top 指令的幾乎一樣,只是沒有那麼詳盡。不過跟 top 指令不同的是,我們可以更深入了解 CPU 是怎麼被使用的。

如果我們看看 system 那一欄,我們就會發現 CPU 每秒平均處理約 500 個中斷;每秒在程序間切換的次數大概是 80 到 400 次。如果您覺得這數目過高,那麼請想想使用者等級的處理比率(us 欄位)平均只有 2%;而系統等級的處理比率(sy 欄位)通常低於 1%;因此在一次證實,這是台閒置的機器。

看看 Sysstat 工具組所提供的這些軟體,我們發現iostatmpstat 所提供的資料,並不比之前從 topvmstat 得到的多。然而, sar 指令所提供的報表,就包含了許多監控 CPU 使用率的訊息。

第一份報表使用的是 sar -q,能顯示執行佇列的長度、所有程序的數量、以及過去 1 分鐘與 5 分鐘的平均負荷。底下是個例子:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (falcon.example.com)      07/21/2003

12:00:01 AM   runq-sz  plist-sz   ldavg-1   ldavg-5
12:10:00 AM         3       122      0.07      0.28
12:20:01 AM         5       123      0.00      0.03
…
09:50:00 AM         5       124      0.67      0.65
Average:            4       123      0.26      0.26
        

在這例子中,系統一直處於忙碌狀態(任何時間都有超過一個程序等著被執行);不過並不是特別忙碌(因為這系統比較特別,有多顆處理器)。

另一個跟 CPU 相關的 sar 報表,是 sar -u 指令的執行結果:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (falcon.example.com)      07/21/2003

12:00:01 AM       CPU     %user     %nice   %system     %idle
12:10:00 AM       all      3.69     20.10      1.06     75.15
12:20:01 AM       all      1.73      0.22      0.80     97.25
…
10:00:00 AM       all     35.17      0.83      1.06     62.93
Average:          all      7.47      4.85      3.87     83.81
        

這張報表裡面的數據,跟許多其他工具沒有什麼分別。sar 最大的好處是資料一路延續下來,可提供長期的平均值,或為 CPU 使用率製作圖表。

在多處理系統上,sar -U 指令還可以產生單個或多個處理器的個別數據。底下是使用 sar -U ALL 的例子:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (falcon.example.com)      07/21/2003

12:00:01 AM       CPU     %user     %nice   %system     %idle
12:10:00 AM         0      3.46     21.47      1.09     73.98
12:10:00 AM         1      3.91     18.73      1.03     76.33
12:20:01 AM         0      1.63      0.25      0.78     97.34
12:20:01 AM         1      1.82      0.20      0.81     97.17
…
10:00:00 AM         0     39.12      0.75      1.04     59.09
10:00:00 AM         1     31.22      0.92      1.09     66.77
Average:            0      7.61      4.91      3.86     83.61
Average:            1      7.33      4.78      3.88     84.02
        

sar -w 指令會顯示每秒環境切換(context switch,或內容切換)的次數,使用者可以從中得知 CPU 週期都耗費在哪些地方:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (falcon.example.com)      07/21/2003

12:00:01 AM   cswch/s
12:10:00 AM    537.97
12:20:01 AM    339.43
…
10:10:00 AM    319.42
Average:      1158.25
        

sar 指令也提供兩種與中斷活動有關的報表。第一種(使用 sar -I SUM 指令)顯示了單一的「每秒中斷數」:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (falcon.example.com)      07/21/2003

12:00:01 AM      INTR    intr/s
12:10:00 AM       sum    539.15
12:20:01 AM       sum    539.49
…
10:40:01 AM       sum    539.10
Average:          sum    541.00
        

使用 sar -I PROC 指令,我們可以用處理器(在多處理器系統中)以及中斷等級(從 0 到 15),來區分中斷活動:

Linux 2.4.21-1.1931.2.349.2.2.entsmp (pigdog.example.com)     07/21/2003

12:00:00 AM  CPU  i000/s  i001/s  i002/s  i008/s  i009/s  i011/s  i012/s
12:10:01 AM    0  512.01    0.00    0.00    0.00    3.44    0.00    0.00

12:10:01 AM  CPU  i000/s  i001/s  i002/s  i008/s  i009/s  i011/s  i012/s
12:20:01 AM    0  512.00    0.00    0.00    0.00    3.73    0.00    0.00
…
10:30:01 AM  CPU  i000/s  i001/s  i002/s  i003/s  i008/s  i009/s  i010/s
10:40:02 AM    0  512.00    1.67    0.00    0.00    0.00   15.08    0.00
Average:       0  512.00    0.42    0.00     N/A    0.00    6.03     N/A
        

這份報表(為了頁面寬度的關係,我們並沒有全數列出)的每一列代表一個中斷等級(例如 i002/s 欄位代表的是中斷等級 2)。如果這是多處理器的電腦,每個 CPU 的每個採樣時間,都會用一行來表示。

另一個重點要請您注意:如果 sar 並未搜集到資料,那麼您就不會看到該欄位。以上面這個例子來說,有幾個中斷(3 跟 10)因為並沒有任何資料,所以根本沒有顯現出來。

注注意
 

sar 指令還有其他的中斷相關選項 — sar -I ALLsar -I XALL。不過預設上,資料搜集工具 sadc 並不會搜集這兩組選項所需的資料,所以您必須編輯檔案 /etc/cron.d/sysstat,把這一行:

*/10 * * * * root /usr/lib/sa/sa1 1 1
          

改成:

*/10 * * * * root /usr/lib/sa/sa1 -I 1 1
          

記住,這選項會讓 sadc 搜集額外的資訊,並產生大量的資料。因此,要這麼做之前,請先確定您的電腦上有足夠的空間。