Liunx中使用iostat分析IO性能

簡介
 
iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啓動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
 
語法
 
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ] 
 
 入門使用
 iostat -d -k 2 
參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;2表示,數據顯示每隔2秒刷新一次。
 
輸出如下
 iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
sda2              1.32         1.43         4.54   29834273   94827104
sda3              6.30         0.85        24.95   17816289  520725244
sda5              0.85         0.46         3.40    9543503   70970116
sda6              0.00         0.00         0.00        550        236
sda7              0.00         0.00         0.00        406          0
sda8              0.00         0.00         0.00        406          0
sda9              0.00         0.00         0.00        406          0
sda10            60.68        18.35        71.43  383002263 1490928140


Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             327.55      5159.18       102.04       5056        100
sda1              0.00         0.00         0.00          0          0 

輸出信息的意義

tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。"一次傳輸"意思是"一次I/O請求"。多個邏輯請求可能會被合併爲"一次I/O請求"。"一次傳輸"請求的大小是未知的。


kB_read/s:每秒從設備(drive expressed)讀取的數據量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;kB_read:讀取的總數據量;
kB_wrtn:寫入的總數量數據量;這些單位都爲Kilobytes。 

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計數據,當時統計的磁盤總TPS是39.29,下面是各個分區的TPS。(因爲是瞬間值,所以總TPS並不嚴格等於各個分區TPS的總和)

指定監控的設備名稱爲sda,該命令的輸出結果和上面命令完全相同。
 
 iostat -d sda 2 
默認監控所有的硬盤設備,現在指定只監控sda。 
 
-x 參數
 
iostat還有一個比較常用的選項-x,該選項將用於顯示和io相關的擴展數據。
 
iostat -d -x -k 1 10
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.80 31.49   42.51    2.92    21.26     1.46     1.16     0.03    0.79   2.62  10.28
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          2.00  20.00 381.00  7.00 12320.00  216.00  6160.00   108.00    32.31     1.75    4.50   2.17  84.20 
 
 
輸出信息的含義

rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge);wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。

rsec/s:每秒讀取的扇區數;
wsec/:每秒寫入的扇區數。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均請求扇區的大小
avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列長度越短越好。    
await:  每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裏可以理解爲IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。
         這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
svctm    表示平均每次設備I/O操作的服務時間(以毫秒爲單位)。如果svctm的值與await很接近,表示幾乎沒有I/O等待,磁盤性能很好,如果await的值遠高於svctm的值,則表示I/O隊列等待太長,         系統上運行的應用程序將變慢。%util: 在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在處理IO,而0.2秒閒置,那麼該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因爲磁盤的併發能力,所以磁盤使用未必就到了瓶頸)。 
 
-c 參數
 
iostat還可以用來獲取cpu部分狀態值:
 
iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67 
 
常見用法
 
iostat -d -k 1 10         #查看TPS和吞吐量信息(磁盤讀寫速度單位爲KB)
iostat -d -m 2            #查看TPS和吞吐量信息(磁盤讀寫速度單位爲MB)
iostat -d -x -k 1 10      #查看設備使用率(%util)、響應時間(await) iostat -c 1 10 #查看cpu狀態 

實例分析
ostat -d -k 1 |grep sda10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda10            60.72        18.95        71.53  395637647 1493241908
sda10           299.02      4266.67       129.41       4352        132
sda10           483.84      4589.90      4117.17       4544       4076
sda10           218.00      3360.00       100.00       3360        100
sda10           546.00      8784.00       124.00       8784        124
sda10           827.00     13232.00       136.00      13232        136 


上面看到,磁盤每秒傳輸次數平均約400;每秒磁盤讀取約5MB,寫入約1MB。

 
iostat -d -x -k 1
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.84 31.50   43.65    3.16    21.82     1.58     1.19     0.03    0.80   2.61  10.29
sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67   126.73    32.15     2.00    4.70   2.00  85.25
sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57     2.10    4.21   1.85  92.24 
可以看到磁盤的平均響應時間<5ms,磁盤使用率>80。磁盤響應正常,但是已經很繁忙了。

Linux系統出現了性能問題,一般我們可以通過top、iostat、free、vmstat等命令來查看初步定位問題。其中iostat可以提供更豐富的IO性能狀態數據。


1. 基本使用
$iostat -d -k 1 10
參數 -d 表示,顯示設備(磁盤)使用狀態;-k某些使用block爲單位的列強制使用Kilobytes爲單位;1 10表示,數據顯示每隔1秒刷新一次,共顯示10次。

$iostat -d -k 1 10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 39.29 21.14 1.44 441339807 29990031
sda1 0.00 0.00 0.00 1623 523
sda2 1.32 1.43 4.54 29834273 94827104
sda3 6.30 0.85 24.95 17816289 520725244
sda5 0.85 0.46 3.40 9543503 70970116
sda6 0.00 0.00 0.00 550 236
sda7 0.00 0.00 0.00 406 0
sda8 0.00 0.00 0.00 406 0
sda9 0.00 0.00 0.00 406 0
sda10 60.68 18.35 71.43 383002263 1490928140

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 327.55 5159.18 102.04 5056 100
sda1 0.00 0.00 0.00 0 0

tps:該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。“一次傳輸”意思是“一次I/O請求”。多個邏輯請求可能會被合併爲“一次I/O請求”。“一次傳輸”請求的大小是未知的。

kB_read/s:每秒從設備(drive expressed)讀取的數據量;kB_wrtn/s:每秒向設備(drive expressed)寫入的數據量;kB_read:讀取的總數據量;kB_wrtn:寫入的總數量數據量;這些單位都爲Kilobytes。

上面的例子中,我們可以看到磁盤sda以及它的各個分區的統計數據,當時統計的磁盤總TPS是39.29,下面是各個分區的TPS。(因爲是瞬間值,所以總TPS並不嚴格等於各個分區TPS的總和)


2. -x 參數

使用-x參數我們可以獲得更多統計信息。

iostat -d -x -k 1 10
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20

rrqm/s:每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合併Merge);wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。

rsec/s:每秒讀取的扇區數;wsec/:每秒寫入的扇區數。r/s:The number of read requests that were issued to the device per second;w/s:The number of write requests that were issued to the device per second;

await:每一個IO請求的處理的平均時間(單位是微秒毫秒)。這裏可以理解爲IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。

%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該設備有0.8秒在處理IO,而0.2秒閒置,那麼該設備的%util = 0.8/1 = 80%,所以該參數暗示了設備的繁忙程度。一般地,如果該參數是100%表示設備已經接近滿負荷運行了(當然如果是多磁盤,即使%util是100%,因爲磁盤的併發能力,所以磁盤使用未必就到了瓶頸)。

3. -c 參數

iostat還可以用來獲取cpu部分狀態值:

iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle
1.98 0.00 0.35 11.45 86.22
avg-cpu: %user %nice %sys %iowait %idle
1.62 0.00 0.25 34.46 63.67

4. 常見用法

$iostat -d -k 1 10 #查看TPS和吞吐量信息
iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await)
iostat -c 1 10 #查看cpu狀態

5. 實例分析

$iostat -d -k 1 |grep sda10
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda10 60.72 18.95 71.53 395637647 1493241908
sda10 299.02 4266.67 129.41 4352 132
sda10 483.84 4589.90 4117.17 4544 4076
sda10 218.00 3360.00 100.00 3360 100
sda10 546.00 8784.00 124.00 8784 124
sda10 827.00 13232.00 136.00 13232 136

上面看到,磁盤每秒傳輸次數平均約400;每秒磁盤讀取約5MB,寫入約1MB。

iostat -d -x -k 1
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29
sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25
sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24


可以看到磁盤的平均響應時間<5ms,磁盤使用率>80。磁盤響應正常,但是已經很繁忙了。

延伸:

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壓力高)
另外 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 洪水.

別人一個不錯的例子.(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 的速度和響應時間.

參考文獻:
Linux man iostat
How Linux iostat computes its results
Linux iostat
來源:
http://www.orczhou.com/index.php/2010/03/iostat-detail/

 

http://www.php-oa.com/2009/02/03/iostat.html

 

 

解釋io相應時間:

IO響應時間(IO Response Time)

  最後來關注一下能直接描述IO性能的IO響應時間。IO響應時間也被稱爲IO延時(IO Latency),IO響應時間就是從操作系統內核發出的一個讀或者寫的IO命令到操作系統內核接收到IO迴應的時間,注意不要和單個IO時間混淆了,單個IO時間僅僅指的是IO操作在磁盤內部處理的時間,而IO響應時間還要包括IO操作在IO等待隊列中所花費的等待時間。


  計算IO操作在等待隊列裏面消耗的時間有一個衍生於利托氏定理(Little’s Law)的排隊模型M/M/1模型可以遵循,由於排隊模型算法比較複雜,到現在還沒有搞太明白(如果有誰對M/M/1模型比較精通的話歡迎給予指導),這裏就羅列一下最後的結果,還是那上面計算的IOPS數據來說:


  8K IO Chunk Size (135 IOPS, 7.2 ms)
  135 => 240.0 ms
  105 => 29.5 ms
  75 => 15.7 ms
  45 => 10.6 ms
  64K IO Chunk Size(116 IOPS, 8.6 ms)
  135 => 沒響應了……
  105 => 88.6 ms
  75 => 24.6 ms
  45 => 14.6 ms


  從上面的數據可以看出,隨着系統實際IOPS越接近理論的最大值,IO的響應時間會成非線性的增長,越是接近最大值,響應時間就變得越大,而且會比預期超出很多。一般來說在實際的應用中有一個70%的指導值,也就是說在IO讀寫的隊列中,當隊列大小小於最大IOPS的70%的時候,IO的響應時間增加會很小,相對來說讓人比較能接受的,一旦超過70%,響應時間就會戲劇性的暴增,所以當一個系統的IO壓力超出最大可承受壓力的70%的時候就是必須要考慮調整或升級了。


  另外補充說一下這個70%的指導值也適用於CPU響應時間,這也是在實踐中證明過的,一旦CPU超過70%,系統將會變得受不了的慢。很有意思的東西。

iostat
iostat用於輸出CPU和磁盤I/O相關的統計信息. 
命令格式:


iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ]  ]
       [ interval [ count ] ]
1)iostat的 簡單使用
iostat可以顯示CPU和I/O系統的負載情況及分區狀態信息. 
直接執行iostat可以顯示下面內容:


# iostat
Linux 2.6.9-8.11.EVAL (ts3-150.ts.cn.tlan)      08/08/2007


avg-cpu:  %user   %nice    %sys %iowait   %idle
             12.01    0.00        2.15    2.30       83.54


Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
hda               7.13       200.12        34.73     640119     111076
各個輸出項目的含義如下:


avg-cpu段:
%user: 在用戶級別運行所使用的CPU的百分比.
%nice: nice操作所使用的CPU的百分比.
%sys: 在系統級別(kernel)運行所使用CPU的百分比.
%iowait: CPU等待硬件I/O時,所佔用CPU百分比.
%idle: CPU空閒時間的百分比.
Device段:
tps: 每秒鐘發送到的I/O請求數.
Blk_read /s: 每秒讀取的block數.
Blk_wrtn/s: 每秒寫入的block數.
Blk_read:   讀入的block總數.
Blk_wrtn:  寫入的block總數.
2)iostat參 數說明
iostat各個參數說明:


-c 僅顯示CPU統計信息.與-d選項互斥.
 -d 僅顯示磁盤統計信息.與-c選項互斥.
 -k 以K爲單位顯示每秒的磁盤請求數,默認單位塊.
 -p device | ALL
  與-x選項互斥,用於顯示塊設備及系統分區的統計信息.也可以在-p後指定一個設備名,如:
  # iostat -p hda
  或顯示所有設備
  # iostat -p ALL
 -t    在輸出數據時,打印蒐集數據的時間.
 -V    打印版本號和幫助信息.
 -x    輸出擴展信息.
3)iostat輸 出項目說明
Blk_read
  讀入塊的當總數.


              Blk_wrtn
  寫入塊的總數.


              kB_read/s
  每秒從驅動器讀入的數據量,單位爲K.


              kB_wrtn/s
  每秒向驅動器寫入的數據量,單位爲K.


              kB_read
  讀入的數據總量,單位爲K.


              kB_wrtn
  寫入的數據總量,單位爲K.


              rrqm/s
  將讀入請求合併後,每秒發送到設備的讀入請求數.


              wrqm/s
  將寫入請求合併後,每秒發送到設備的寫入請求數.


              r/s
  每秒發送到設備的讀入請求數.


              w/s
  每秒發送到設備的寫入請求數.


              rsec/s
  每秒從設備讀入的扇區數.


              wsec/s
  每秒向設備寫入的扇區數.


              rkB/s
  每秒從設備讀入的數據量,單位爲K.


              wkB/s
  每秒向設備寫入的數據量,單位爲K.


              avgrq-sz
  發送到設備的請求的平均大小,單位是扇區.


              avgqu-sz
  發送到設備的請求的平均隊列長度.


              await
  I/O請求平均執行時間.包括髮送請求和執行的時間.單位是毫秒.


              svctm
  發送到設備的I/O請求的平均執行時間.單位是毫秒.


              %util
  在I/O請求發送到設備期間,佔用CPU時間的百分比.用於顯示設備的帶寬利用率.
  當這個值接近100%時,表示設備帶寬已經佔滿.
4)iostat示 例
#  iostat
 顯示一條統計記錄,包括所有的CPU和設備.


      # iostat -d 2
 每隔2秒,顯示一次設備統計信息.


      # iostat -d 2 6
 每隔2秒,顯示一次設備統計信息.總共輸出6次.


      # iostat -x hda hdb 2 6
 每隔2秒顯示一次hda,hdb兩個設備的擴展統計信息,共輸出6次.


      # iostat -p sda 2 6
 每隔2秒顯示一次sda及上面所有分區的統計信息,共輸出6次.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章