iostat命令詳解


iostat命令詳解

iostat 主要是統計 磁盤活動情況。

iostat有以下缺陷:

iostat的輸出結果大多數是一段時間內的平均值,因此難以反映峰值情況
iostat僅能對系統整體情況進行分析匯報,卻不能針對某個進程進行深入分析。
iostat未單獨統計IO處理信息,而是將IO處理時間和IO等待時間合並統計,因此包括await在內的指標並不能非常准確地衡量磁盤性能表現。

 

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:該設備每秒的傳輸次數。"一次傳輸"意思是"一次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:每秒合並讀操作的次數,如果兩個讀操作讀取相鄰的數據塊時,可以被合並成一個,以提高效率。合並的操作通常是I/O scheduler(也叫elevator)負責的。每秒這個設備相關的讀取請求有多少被Merge了(當系統調用需要讀取數據的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的數據,FS會將這個請求合並Merge);
wrqm/s:每秒這個設備相關的寫入請求有多少被Merge了。 rsec/s:每秒讀取的扇區數; wsec/:每秒寫入的扇區數。

  rKB/s:每秒讀取的字節數(KB)

  wKB/s:每秒寫入的字節數(KB)

avgrq-sz 平均請求扇區的大小
avgqu-sz 是平均請求隊列的長度。毫無疑問,隊列越短越好。    
await:  每一個IO請求的處理的平均時間(單位是微秒毫秒)。這里可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。
         這個時間包括了隊列時間服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。

           r_await:每個讀操作平均所需要的時間,包括硬盤設備讀操作的時間,也包括在內核隊列中的時間。

       w_wait:每個寫操平均所需要的時間,包括硬盤設備寫操作的時間,也包括在隊列中等待的時間。

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%,因為磁盤的並發能力,所以磁盤使用未必就到了瓶頸)。
復制代碼

 

深入解析
avgqu-sz

IO請求的隊列長度,反映了系統磁盤任務處理的繁忙程度,該值越大,表示排隊等待處理的IO請求越多
平均隊列長度的計算:
我們考慮如下的場景,如果同一時間來了250個IO請求,后續再也沒有新的請求到來。這種情況下,每個請求處理時間都是4ms,那么所有IO的平均等待時間為:

平均等待時間 = 單個請求處理時間*(1+2+3+4...+(請求總數-1))/請求總數

對於我們的例子來說,平均等待時間是 500ms,那么所有IO花費的總時間為250*500 = 125000ms,這個時間除以1000ms,得到 125,即平均隊列長度。
這個值很明顯是符合直觀的。排在隊列最前端的IO認為,隊列的長度是0,第2個IO認為隊列的長度是1,第3個IO認為隊列的長度是2,最后一個認為隊列的長度是249。

await

await是單個I/O所消耗的時間,包括硬盤設備處理I/O的時間和I/O請求在kernel隊列中等待的時間:

await = IO 平均處理時間 + IO在隊列的平均等待時間

正常情況下隊列等待時間可以忽略不計:

await = ((所有讀IO的時間)+(所有寫IO的時間))/((讀請求的個數) + (寫請求的個數))

這個值,多大算正常呢?
對於SSD,從0.0x毫秒到1.x毫秒不等,具體看產品手冊。
對於機械硬盤,大致來說一萬轉的機械硬盤是8.38毫秒,包括尋道時間、旋轉延遲、傳輸時間。
關於await的一個誤區是,人們常常武斷地認為,await值比較高,就認為磁盤性能差,其實,await這個值不能反映硬盤設備的性能。
我們考慮兩種IO的模型:

250個IO請求同時進入等待隊列
250個IO請求依次發起,待上一個IO完成后,發起下一個IO
第一種情況await高達500ms,第二個情況await只有4ms,但是都是同一塊盤。
在實踐中,要根據應用場景來判斷await是否正常,如果I/O模式很隨機、I/O負載比較高,會導致磁頭亂跑,尋道時間長,那么相應地await要估算得大一些如果I/O模式是順序讀寫,只有單一進程產生I/O負載,那么尋道時間和旋轉延遲都可以忽略不計,主要考慮傳輸時間,相應地await就應該很小,甚至不到1毫秒。
對磁盤陣列來說,因為有硬件緩存,寫操作不等落盤就算完成,所以寫操作的service time大大加快了,如果磁盤陣列的寫操作不在一兩個毫秒以內就算慢的了;讀操作則未必,不在緩存中的數據仍然需要讀取物理硬盤,單個小數據塊的讀取速度跟單盤差不多。

%util

%util表示該設備有I/O(即非空閑)的時間比率,不考慮I/O有多少,只考慮有沒有。

很多初學者看到%util 等於100%就說硬盤能力到頂了,這種說法是錯誤的。

由於現代硬盤設備都有並行處理多個I/O請求的能力,所以%util即使達到100%也不意味着設備飽和了,舉個簡化的例子:

某硬盤處理單個I/O需要0.1秒,有能力同時處理10個I/O請求。
當10個I/O請求依次順序提交的時候,需要1秒才能全部完成,在1秒的采樣周期里%util達到100%。
而如果10個I/O請求一次性提交的話,0.1秒就全部完成,在1秒的采樣周期里%util只有10%。
可見,即使%util高達100%,硬盤也仍然有可能還有余力處理更多的I/O請求,即沒有達到飽和狀態。那么iostat有沒有哪個指標可以衡量硬盤設備的飽和程度呢?很遺憾,沒有。

 

實例分析

復制代碼
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

可以看到磁盤的平均響應時間await<5ms,磁盤使用率%util>80,avgqu-sz出現了等待處理的io,表明磁盤響應正常,但是已經很繁忙了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM