使用iostat分析IO效能
對於I/O-bond型別的程序,我們經常用iostat工具檢視程序IO請求下發的數量、系統處理IO請求的耗時,進而分析程序與作業系統的互動過程中IO方面是否存在瓶頸。
下面通過iostat命令使用例項,說明使用iostat檢視IO請求下發情況、系統IO處理能力的方法,以及命令執行結果中各欄位的含義。
1.不加選項執行iostat
我們先來看直接執行iostat的輸出結果:
linux # iostat Linux 2.6.16.60-0.21-smp (linux) 06/12/12 avg-cpu: %user %nice %system %iowait %steal %idle0.07 0.00 0.05 0.06 0.00 99.81 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.58 9.95 37.47 6737006 25377400 sdb 0.00 0.00 0.00 824 0
單獨執行iostat,顯示的結果為從系統開機到當前執行時刻的統計資訊。以上輸出中,除最上面指示系統版本、主機名和日期的一行外,另有兩部分:
avg-cpu: 總體cpu使用情況統計資訊,對於多核cpu,這裡為所有cpu的平均值
Device: 各磁碟裝置的IO統計資訊
對於cpu統計資訊一行,我們主要看iowait的值,它指示cpu用於等待io請求完成的時間。Device中各列含義如下:
- Device: 以sdX形式顯示的裝置名稱
- tps: 每秒程序下發的IO讀、寫請求數量
- Blk_read/s: 每秒讀扇區數量(一扇區為512bytes)
- Blk_wrtn/s: 每秒寫扇區數量
- Blk_read: 取樣時間間隔內讀扇區總數量
- Blk_wrtn: 取樣時間間隔內寫扇區總數量
我們可以使用-c選項單獨顯示avg-cpu部分的結果,使用-d選項單獨顯示Device部分的資訊。
2.指定取樣時間間隔與取樣次數
與sar命令一樣,我們可以以"iostat interval [count] ”形式指定iostat命令的取樣間隔和取樣次數:
linux # iostat -d 1 2 Linux 2.6.16.60-0.21-smp (linux) 06/13/12 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.55 8.93 36.27 6737086 27367728 sdb 0.00 0.00 0.00 928 0 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 2.00 0.00 72.00 0 72 sdb 0.00 0.00 0.00 0 0
以上命令輸出Device的資訊,取樣時間為1秒,取樣2次,若不指定取樣次數,則iostat會一直輸出取樣資訊,直到按”ctrl+c”退出命令。注意,第1次取樣資訊與單獨執行iostat的效果一樣,為從系統開機到當前執行時刻的統計資訊。
3.以kB為單位顯示讀寫資訊(-k選項)
我們可以使用-k選項,指定iostat的部分輸出結果以kB為單位,而不是以扇區數為單位:
linux # iostat -d -k Linux 2.6.16.60-0.21-smp (linux) 06/13/12 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.55 4.46 18.12 3368543 13686096 sdb 0.00 0.00 0.00 464 0
以上輸出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB為單位,相比以扇區數為單位,這裡的值為原值的一半(1kB=512bytes*2)
4.更詳細的io統計資訊(-x選項)
為顯示更詳細的io裝置統計資訊,我們可以使用-x選項,在分析io瓶頸時,一般都會開啟-x選項:
linux # iostat -x -k -d 1 Linux 2.6.16.60-0.21-smp (linux) 06/13/12 …… Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.00 9915.00 1.00 90.00 4.00 34360.00 755.25 11.79 120.57 6.33 57.60
以上各列的含義如下:
- rrqm/s: 每秒對該裝置的讀請求被合併次數,檔案系統會對讀取同塊(block)的請求進行合併
- wrqm/s: 每秒對該裝置的寫請求被合併次數
- r/s: 每秒完成的讀次數
- w/s: 每秒完成的寫次數
- rkB/s: 每秒讀資料量(kB為單位)
- wkB/s: 每秒寫資料量(kB為單位)
- avgrq-sz:平均每次IO操作的資料量(扇區數為單位)
- avgqu-sz: 平均等待處理的IO請求佇列長度
- await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
- svctm: 平均每次IO請求的處理時間(毫秒為單位)
- %util: 採用週期內用於IO操作的時間比率,即IO佇列非空的時間比率
對於以上示例輸出,我們可以獲取到以下資訊:
- 每秒向磁碟上寫30M左右資料(wkB/s值)
- 每秒有91次IO操作(r/s+w/s),其中以寫操作為主體
- 平均每次IO請求等待處理的時間為120.57毫秒,處理耗時為6.33毫秒
- 等待處理的IO請求佇列中,平均有11.79個請求駐留
以上各值之間也存在聯絡,我們可以由一些值計算出其他數值,例如:
util = (r/s+w/s) * (svctm/1000)
對於上面的例子有:util = (1+90)*(6.33/1000) = 0.57603