Io性能分析

1、iostat使用說明

 

1、命令使用方法

 

        使用ixstat –x 1 能夠每隔1秒鐘採集全部設備的io信息。其中的1相似於使用「vmstat  1後面的1ios

 

2、命令格式說明

 

―――――――――――――――――――――――――――――――――――――――算法

 

Linux 2.4.31-2bs (zjm-testing-ecom504.zjm.baidu.com)    01/14/2008性能

 

avg-cpu:  %user   %nice    %sys   %idle優化

 

           0.11    0.16    0.37   99.37spa

 

Device:   隊列

 

rrqm/s  wrqm/s  r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz  avgqu-sz   await  svctm  %util內存

 

/dev/cciss/c0d0ci

 

 0.02    0.05  0.01  0.19   0.23    1.98     0.11     0.99  10.87              0.03         12.73   9.73  it

 

0.20io

 

――――――――――――――――――――――――――――――――――――――――――――――

 

Avg-cpu

 

       打印的是cpu相關的信息。不作介紹了。

 

每一個設備的io相關的參數以下:

 

rrqm/s: 每秒進行 merge 的讀操做數目。即 delta(rmerge)/s

 

wrqm/s: 每秒進行 merge 的寫操做數目。即 delta(wmerge)/s

 

r/s: 每秒完成的讀 I/O 設備次數。即 delta(rio)/s

 

w/s: 每秒完成的寫 I/O 設備次數。即 delta(wio)/s

 

rsec/s: 每秒讀扇區數。即 delta(rsect)/s

 

wsec/s: 每秒寫扇區數。即 delta(wsect)/s

 

rkB/s: 每秒讀K字節數。是 rsect/s 的一半,由於每扇區大小爲512字節。

 

wkB/s: 每秒寫K字節數。是 wsect/s 的一半。

 

avgrq-sz: 平均每次設備I/O操做的數據大小 (扇區)。即 delta(rsect+wsect)/delta(rio+wio)

 

avgqu-sz: 平均I/O隊列長度。即 delta(aveq)/s/1000 (由於aveq的單位爲毫秒)

 

await: 平均每次設備I/O操做的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)

 

svctm: 平均每次設備I/O操做的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)

 

%util: 一秒中有百分之多少的時間用於 I/O 操做或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (由於use的單位爲毫秒).若是 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸。

 

2、排隊論和io

 

       舉一個例子,咱們在超市排隊 checkout 時,怎麼決定該去哪一個交款臺呢首當是看排的隊人數,5我的總比20人要快吧除了數人頭,咱們也經常看看前面人購買的東西多少,若是前面有個採購了一星期食品的大媽,那麼能夠考慮換個隊排了。還有就是收銀員的速度了,若是碰上了連錢都點不清楚的新手,那就有的等了。另外,時機也很重要,可能 5 分鐘前還人滿爲患的收款臺,如今已經是人去樓空,這時候交款但是很爽啊,固然,前提是那過去的 5分鐘裏所作的事情比排隊要有意義。

 

I/O 系統也和超市排隊有不少相似之處:

 

       r/s+w/s 相似於交款人的總數

 

       平均隊列長度(avgqu-sz)相似於單位時間裏平均排隊人的個數

 

       平均服務時間(svctm)相似於收銀員的收款速度

 

       平均等待時間(await)相似於平均每人的等待時間

 

       平均I/O數據(avgrq-sz)相似於平均每人所買的東西多少

 

    I/O 操做率 (%util)相似於收款臺前有人排隊的時間比例。

 

3、io分析實例

 

1、幾個參數間的關係

 

    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 洪水。

 

2、實例分析

 

# iostat -x 1
avg-cpu:  %user   %nice    %sys   %idle
          16.24    0.00    4.31   79.44
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
/dev/cciss/c0d0
             0.00  44.90  1.02 27.55    8.16  579.59     4.08   289.80    20.57    22.35   78.21   5.00  14.29
/dev/cciss/c0d0p1
             0.00  44.90  1.02 27.55    8.16  579.59     4.08   289.80    20.57    22.35   78.21   5.00  14.29
/dev/cciss/c0d0p2
             0.00   0.00  0.00  0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

 

       上面的 iostat 輸出代表秒有 28.57 次設備 I/O 操做: delta(io)/s = r/s +w/s = 1.02+27.55 = 28.57 (/其中寫操做佔了主體 (w:r = 27:1)。平均每次設備 I/O 操做只須要 5ms 就能夠完成,但每一個 I/O 請求卻須要等上 78ms,爲何由於發出的 I/O 請求太多 (每秒鐘約 29 ),假設這些請求是同時發出的,那麼平均等待時間能夠這樣計算:

 

平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + ... + 請求總數-1) / 請求總數。應用到上面的例子平均等待時間 = 5ms * (1+2+...+28)/29 = 70ms,和iostat 給出的 78ms 的平均等待時間很接近。這反過來代表 I/O 是同時發起的。

 

每秒發出的 I/O 請求不少 ( 29 ),平均隊列卻不長 (只有 2  左右),這代表這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的。一秒中有14.29% 的時間 I/O 隊列中是有請求的,也就是說,85.71% 的時間裏 I/O 系統無事可作,全部 29  I/O 請求都在142毫秒以內處理掉了。delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,代表每秒內的I/O請求總共須要等待2232.8ms。因此平均隊列長度應爲 2232.8ms/1000ms = 2.23,而 iostat 給出的平均隊列長度 (avgqu-sz) 卻爲 22.35,爲何?! 由於 iostat 中有bugavgqu-sz 值應爲 2.23,而不是 22.35

相關文章
相關標籤/搜索