Linux命令----分析系統I/O的瓶頸

huaze發表於2022-03-23
一,用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

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/2009
12: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:每秒鐘寫入磁碟的資料的總數
 
四,sar -d 1 10
Linux 2.6.18-53.el5PAE (localhost.localdomain)  03/29/2009
12: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時間百分比。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015605/viewspace-2883512/,如需轉載,請註明出處,否則將追究法律責任。

相關文章