Linux系統出現了性能問題,硬盤的讀寫速度及狀態是我們判斷服務器性能的一個重要參考,而iostat可以給我們提供豐富的IO狀態數據。
基本使用
$iostat -d -k 1 10
參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;1 10表示,數據顯示每隔1秒刷新一次,共顯示10次。
# iostat -x 1 10
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系統已經滿負荷,該磁盤可能存在瓶頸。
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 洪水。
# iostat -x 1
上面的 iostat 輸出表明秒有 11.88 次設備 I/O 操作: 總IO(io)/s = r/s(讀) +w/s(寫) = 6.49+7.39 = 11.88 (次/秒) 其中寫操作佔了主體 (w:r = 7:6)。
平均每次設備 I/O 操作只需要 5ms 就可以完成,這是比較正常的數值。
因爲發出的 I/O 請求太多 ,假設這些請求是同時發出的,那麼平均等待時間可以這樣計算:
平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + ... + 請求總數-1) / 請求總數。 Input Output statistics ( iostat )
iostat反映了終端、磁盤I/O情況和CPU活動。輸出結果的第一行是從系統啓動到現在爲止的這段時間的結果,接下去的每一行是interval時間段內的結果。Kernel裏有一組計數器用來跟蹤這些值。
iostat的默認參數是tdc(terminal, disk, and CPU)。如果任何其他的選項被指定,這個默認參數將被完全替代,例如,iostat -d將只反映磁盤的統計結果。
語法:
基本語法: iostat ; interval count
option - 讓你指定所需信息的設備,像磁盤、cpu或者終端(-d , -c , -t or -tdc ) 。x 選項給出了完整的統計結果(gives the extendedstatistic)。
interval - 在兩個samples之間的時間(秒)。
count - 就是需要統計幾次。
例子:
The fields have the following meanings:
disk name of the disk
r/s reads per second
w/s writes per second
Kr/s kilobytes read per second
Kw/s kilobytes written per second
wait average number of transactions waiting for service (Q length)
actv average number of transactions actively
being serviced (removed from the queue but not yet completed)
%w percent of time there are transactions waiting for service (queue non-empty)
%b percent of time the disk is busy (transactions
in progress)R
esults and Solutions:
從iostat輸出結果中需要注意的值:
Reads/writes per second (r/s , w/s)
Percentage busy (%b)
Service time (svc_t)
如果磁盤顯示長時間的高reads/writes,並且磁盤的percentage busy (%b)也遠大於5%,同時average service time (svc_t)也遠大於30milliseconds,這以下的措施需要被執行:
1.)調整應用,令其使用磁盤i/o更加有效率,可以通過修改磁盤隊列、使用應用服務器的cache
2.)將文件系統分佈到2個或多個磁盤上,並使用volume manager/disksuite的條帶化特點
3.) 增加系統參數值,如inode cache , ufs_ninode。Increase the system parameter values for inode cache , ufs_ninode , which is Number of inodes to be held in memory. Inodes are cached globally (for UFS), not on a per-file system basis
4.) 將文件系統移到更快的磁盤/控制器,或者用更好的設備來代替