iostat :
Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions.
主要是統計cup的狀況設備和分區的i/o信息
[root@billtest ~]# iostat
Linux 2.6.18-194.el5 (billtest) 01/09/2014
avg-cpu: %user %nice %system %iowait %steal %idle
8.84 0.17 1.26 1.57 0.00 88.17
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 21.41 2.04 399.41 39733155 7797825326
sda1 0.00 0.00 0.00 1623 78
sda2 0.00 0.09 0.13 1790370 2594176
sda3 1.69 0.48 53.17 9389146 1038079184
sda4 0.00 0.00 0.00 10 0
sda5 0.01 0.04 0.45 865722 8729848
sda6 5.93 0.63 70.24 12299666 1371347704
sda7 13.77 0.79 275.42 15386170 5377074336
sdb 0.10 0.37 2.48 7227786 48461024
顯示結果解讀:
%user 用戶級別的應用當前cup的利用率
%nice 用戶級別好的優先級的情況下cup利用率
%system 系統級別的cup使用情況
%iowait 系統輸出數據至磁盤時空閒的CPU時間百分比(即IO等待)
%steal
%idle 系統沒有任何數據輸出至磁盤的CPU時間百分比(即空閒時間)
device
tps 該設備每秒的傳輸次數,一次傳輸一次I/O
Blk_read/s 每秒從設備讀取
Blk_wrtn/s- 每秒寫入設備
Blk_read 讀取的總數據量
Blk_wrtn 寫入的總數據量
命令參數:
-c 顯示cup的統計信息x
-d 顯示設備的使用狀態
-k 某些使用block為單位的列強制使用Kilobytes為單位
-x 給出更多的狀態參數Device:
iostat -d -x 1 3
注: 後面的2個數字的參數的含義是 每秒顯示一次,顯示三次。
一個是頻度,一個是總的顯示次數
rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 39.00 0.00 4.00 0.00 172.00 86.00 0.06 14.50 10.50 4.20
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda3 0.00 39.00 0.00 4.00 0.00 172.00 86.00 0.06 14.50 10.50 4.20
sda4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
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的單位為毫秒)
常見用法:
$iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await)
iostat -c 1 10 #查看cpu狀態
怎麼讀顯示的報告:
如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸.
idle小於70% IO壓力就較大了,一般讀取速度有較多的wait.
同時可以結合vmstat 查看查看b參數(等待資源的進程數)和wa參數(IO等待所占用的CPU時間的百分比,高過30%時IO壓力高)
另外 await 的參數也要多和 svctm 來參考.差的過高就一定有 IO 的問題.
avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的數據的大小,如果次數多,但數據拿的小的話,其實 IO 也會很小.如果數據拿的大,才IO 的數據會高.也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是講,讀定速度是這個來決定的.
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 洪水.
參考:
1 Linux man iostat
2 http://www.ha97.com/4546.html