1. 程式人生 > >使用iostat來對linux硬碟IO效能進行檢測

使用iostat來對linux硬碟IO效能進行檢測

每秒進行 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系統已經滿負荷,該磁碟可能存在瓶頸;idle小於70% IO壓力就較大了,一般讀取速度有較多的wait同時可以結合vmstat 檢視檢視b引數(等待資源的程序數)wa引數(IO等待所佔用的CPU時間的百分比,高過30%IO壓力高)另外還可以參考一般:
svctm < await (
因為同時等待的請求的等待時間被重複計算了)
svctm
的大小一般和磁碟效能有關:CPU/記憶體的負荷也會對其有影響,請求過多也會間接導致 svctm 
的增加。
await: await
的大小一般取決於服務時間(svctm) 以及 I/O 佇列的長度和 I/O 請求的發出模式如果svctm 比較接近await,說明I/O 幾乎沒有等待時間;如果await 遠大於svctm,說明I/O佇列太長,應用得到的響應時間變慢如果響應時間超過了使用者可以容許的範圍,這時可以考慮更換更快的磁碟,調整核心elevator演算法,優化應用,或者升級 CPU。佇列長度(avgqu-sz)也可作為衡量系統 I/O 負荷的指標,但由於 avgqu-sz 是按照單位時間的平均值,所以不能反映瞬間的 I/O洪水。別人一個不錯的例子(I/O 系統vs超市排隊)舉一個例子,我們在超市排隊 checkout 時,怎麼決定該去哪個交款臺呢首當是看排的隊人數,5個人總比20人要快吧?除了數人頭,我們也常常看看前面人購買的東西多少,如果前面有個採購了一星期食品的大媽,那麼可以考慮換個隊排了。還有就是收銀員的速度了,如果碰上了連錢都點不清楚的新手,那就有的等了。另外,時機也很重要,可能 5分鐘前還人滿為患的收款臺,現在已是人去樓空,這時候交款可是很爽啊,當然,前提是那過去的 5 分鐘裡所做的事情比排隊要有意義(不過我還沒發現什麼事情比排隊還無聊的)
I/O 
系統也和超市排隊有很多類似之處:
r/s+w/s 
類似於交款人的總數平均佇列長度(avgqu-sz)類似於單位時間裡平均排隊人的個數平均服務時間(svctm)類似於收銀員的收款速度平均等待時間(await)類似於平均每人的等待時間平均I/O資料(avgrq-sz)類似於平均每人所買的東西多少
I/O 
操作率 (%util)類似於收款臺前有人排隊的時間比例。我們可以根據這些資料分析出 I/O 請求的模式,以及 I/O 的速度和響應時間。下面是別人寫的這個引數輸出的分析
# 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 操作IO(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 ),平均佇列卻不長 (只有個左右),這表明這 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