在 Red Hat Enterprise Linux 下監控頻寬與 CPU 的使用狀態,需要用到 第2章 所討論過的工具;因此,如果您尚未閱讀該章節,請在繼續之前,先把它瀏覽一遍。
正如 第 2.4.2 節 一節所提到的,要直接監控頻寬使用率不是件容易的事。然而,藉由檢視裝置層的數據,我們就可以大略得知系統是不是有頻寬不足的問題。
我們可以使用 vmstat 指令,檢視其中的 bi 與 bo欄位,以得知整體的裝置活動是否過於頻繁;除此之外,記下 si 與 so 欄位的內容,也能讓您進一步得知有多少磁碟活動,是跟置換(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 個磁區從磁區裝置讀出。我們也可以確定,這些動作跟記憶體置換無關,因為 si 與 so 欄位指出,與置換有關的 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/s 與 rkB/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
|
這報告提供的是裝置訊息,但沒有那麼詳盡。
雖然沒有任何資料明確顯示某個匯流排或資料路徑的頻寬使用率,但我們可以藉由裝置的活動,間接得知匯流排的工作負荷。
跟頻寬不同,監控 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 相關的資訊(us、sy、以及us欄位)看起來跟 top 指令的幾乎一樣,只是沒有那麼詳盡。不過跟 top 指令不同的是,我們可以更深入了解 CPU 是怎麼被使用的。
如果我們看看 system 那一欄,我們就會發現 CPU 每秒平均處理約 500 個中斷;每秒在程序間切換的次數大概是 80 到 400 次。如果您覺得這數目過高,那麼請想想使用者等級的處理比率(us 欄位)平均只有 2%;而系統等級的處理比率(sy 欄位)通常低於 1%;因此在一次證實,這是台閒置的機器。
看看 Sysstat 工具組所提供的這些軟體,我們發現iostat 與 mpstat 所提供的資料,並不比之前從 top 與 vmstat 得到的多。然而, 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 ALL 與 sar -I XALL。不過預設上,資料搜集工具 sadc 並不會搜集這兩組選項所需的資料,所以您必須編輯檔案 /etc/cron.d/sysstat,把這一行:
改成:
記住,這選項會讓 sadc 搜集額外的資訊,並產生大量的資料。因此,要這麼做之前,請先確定您的電腦上有足夠的空間。 |