一,用vmstat分析系統I/O情況[root@localhost ~]# vmstat -n 3 (每個3秒重新整理一次)
procs-----------memory--------------------swap--- ---io---- --system---- ------cpu--------
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 144 186164 105252 2386848 0 0 18 166 83 2 48 21 31 0
2 0 144 189620 105252 2386848 0 0 0 177 1039 1210 34 10 56 0
0 0 144 214324 105252 2386848 0 0 0 10 1071 670 32 5 63 0
0 0 144 202212 105252 2386848 0 0 0 189 1035 558 20 3 77 0
2 0 144 158772 105252 2386848 0 0 0 203 1065 2832 70 14 15 0
IO
-bi:從塊裝置讀入的資料總量(讀磁碟)(KB/S)
-bo:寫入到塊裝置的資料總量(寫磁碟)(KB/S)
隨機磁碟讀寫的時候,這2個值越大(如超出1M),能看到CPU在IO等待的值也會越大
二,用iostat分析I/O子系統情況
如果你的系統沒有iostat,sar,mpstat等命令,安裝
sysstat-7.0.2-1.el5.i386.rpm包,iostat工具將對系統的磁碟操作活動進行監視。它的特點是彙報磁碟活動統計情況,同時也會彙報出CPU使用方式。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析,僅對系統的整體情況進行分析。
iostat的文法如下:
程式代碼
iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ] -c為彙報CPU的使用方式;-d為彙報磁碟的使用方式;-k表示每秒按kilobytes位元組顯示資料;-t為列印彙報的時間;-v表示列印出版本資訊和用法;-x device指定要統計的裝置名稱,預設為所有的裝置;interval指每次統計間隔的時間;count指按照這個時間間隔統計的次數。 iostat在核心2.4和核心2.6中資料來源不太一樣,對於kernel 2.4, iostat 的資料的主要來源是 /proc/partitions;在2.6中,資料來源主要是/proc/diskstats和/sys/block/sd*/stat這兩個檔案#cat /proc/diskstats | grep sda
8 0 sda 17945521 1547188 466667211 174042714 15853874 42776252 469241932 2406054445 0 137655809 2580960422
8 1 sda1 936 1876 6 12
8 2 sda2 19489178 466659986 58655070 469240224
8 3 sda3 1270 1441 33 264
8 4 sda4 4 8 0 0
8 5 sda5 648 1442 0 0
8 6 sda6 648 1442 0 0 第1列 : 磁碟主裝置號(major)
第2列 : 磁碟次裝置號(minor)
第3列 : 磁碟的裝置名稱(name)
第4列 : 讀請求總數(rio)
第5列 : 合并的讀請求總數(rmerge)
第6列 : 讀扇區總數(rsect)
第7列 : 讀資料花費的時間,單位是ms.(從__make_request到 end_that_request_last)(ruse)
第8列 : 寫請求總數(wio)
第9列 : 合并的寫請求總數(wmerge)
第10列 : 寫扇區總數(wsect)
第11列 : 寫資料花費的時間,單位是ms. (從__make_request到 end_that_request_last)(wuse)
第12列 : 現在進行中的I/O數(running),等於I/O隊列中請求數
第13列 : 系統真正花費在I/O上的時間,除去重複等待時間(aveq)
第14列 : 系統在I/O上花費的時間(use)。
#iostat -x 1
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/27/2009
avg-cpu: %user %nice %system %iowait %steal %idle
30.72 0.00 5.00 5.72 0.00 58.56
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.79 21.81 9.15 8.08 237.99 239.29 27.69 1.32 76.31 4.07 7.02
sdb 0.69 19.13 3.26 2.99 153.08 176.92 52.85 0.43 68.80 5.96 3.72
sdc 3.47 89.30 10.95 7.30 213.30 772.94 54.04 1.32 72.43 4.18 7.63
每項資料的含義如下,
rrqm/s: 每秒進行 merge 的讀運算元目。即 rmerge/s
wrqm/s: 每秒進行 merge 的寫運算元目。即 wmerge/s
r/s: 每秒完成的讀 I/O 裝置次數。即 rio/s
w/s: 每秒完成的寫 I/O 裝置次數。即 wio/s
rsec/s: 每秒讀扇區數。即 rsect/s
wsec/s: 每秒寫扇區數。即 wsect/s
rkB/s: 每秒讀K位元組數。是 rsect/s 的一半,因為每扇區大小為512位元組。
wkB/s: 每秒寫K位元組數。是 wsect/s 的一半。
avgrq-sz: 平均每次裝置I/O操作的資料大小 (扇區)。即 (rsect+wsect)/(rio+wio)
avgqu-sz: 平均I/O隊列長度。即 aveq/1000 (因為aveq的單位為毫秒)。
await: 平均每次裝置I/O操作的等待時間 (毫秒)。即 (ruse+wuse)/(rio+wio)
svctm: 平均每次裝置I/O操作的服務時間 (毫秒)。即 use/(rio+wio)
%util: 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間
I/O隊列是非空的,即use/1000 (因為use的單位為毫秒),
如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸。
svctm 一般要小於 await (因為同時等待的請求的等待時間被重複計算了),
svctm 的大小一般和磁碟效能有關,CPU/記憶體的負荷也會對其有影響,請求過多
也會間接導致 svctm 的增加。
await 的大小一般取決於服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。如果 svctm 比較接近 await,說明 I/O 幾乎沒有等待時間;如果 await 遠大於 svctm,說明 I/O 隊列太長,應用得到的回應時間變慢,如果回應時間超過了使用者可以容許的範圍,這時可以考慮更換更快的磁碟,調整核心 elevator 演算法,最佳化應用,或者升級 CPU。
隊列長度(avgqu-sz)也可作為衡量系統 I/O 負荷的指標,但由於 avgqu-sz 是按照單位時間的平均值,所以不能反映瞬間的 I/O 洪水。
io/s = r/s +w/s
await=(ruse+wuse)/io(每個請求的等待時間)
await*io/s=每秒內的I/O請求總共需要等待的ms
四,sar -d 1 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/200912:38:56 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
12:38:57 AM dev8-0 15.00 232.00 0.00 15.47 0.01 0.87 0.87 1.30
12:38:57 AM dev8-16 6.00 80.00 320.00 66.67 0.05 8.67 8.67 5.20
12:38:57 AM dev8-32 10.00 224.00 0.00 22.40 0.09 9.20 9.20 9.20 tps:每秒鐘對磁碟發送transfer的總數,一個transfer就是一個I/O,多個邏輯請求組合成一個對磁碟的I/O請求,一個transfer的大小不確定 rd_sec/s
每秒鐘讀取的扇區數,每個扇區512 bytes. wr_sec/s
每秒鐘寫入的扇區數,每個扇區512 bytes. avgrq-sz
對磁碟請求的扇區的平均大小。 avgqu-sz
對磁碟請求的平均隊列長度. await
請求響應的平均時間(毫秒).包括在請求隊列中的時間和響應消耗時間 svctm
對IO請求的服務時間. %util
I/O請求佔用的CPU時間百分比。轉自:http://space.itpub.net/8554499/viewspace-580306
avgqu-sz=await*(r/s+w/s)/1000(隊列長度)
以下資料其實與/proc/diskstats中除裝置號與裝置名稱外的其它資料是一一對應關係,只是統計的方法略有差別而已。
#cat /sys/block/sda/stat
17949157 1547772 466744707 174070520 15855905 42781288 469298468 2406092114 2 137680700 2581025934
三,sar -b 監控I/O
#sar -b 1 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/200912:19:40 AM tps rtps wtps bread/s bwrtn/s
12:19:42 AM 21.48 9.40 12.08 187.92 429.53
12:19:43 AM 14.00 14.00 0.00 840.00 0.00
12:19:44 AM 10.29 8.82 1.47 235.29 217.65
12:19:45 AM 12.87 10.89 1.98 752.48 142.57
12:19:46 AM 19.82 12.61 7.21 425.23 381.98
12:19:47 AM 19.00 19.00 0.00 512.00 0.00
12:19:49 AM 9.29 9.29 0.00 262.86 0.00
12:19:50 AM 16.00 5.00 11.00 144.00 536.00
12:19:51 AM 17.65 8.82 8.82 211.76 235.29
12:19:52 AM 41.41 29.29 12.12 614.14 363.64
Average: 17.75 12.30 5.45 397.19 231.99 -tps:每秒鐘對磁碟發送transfer的總數,一個transfer就是一個I/O,多個邏輯請求組合成一個對磁碟的I/O請求,一個transfer的大小不確定。-rtps:每秒鐘的物理讀的總數-wtps:每秒鐘的物理寫的總數-bread/s:每秒鐘從磁碟讀取的資料總數
-bwrtn/s:每秒鐘寫入磁碟的資料的總數