- iostat
- 性能評估的一個主要部分就是磁盤性能。iostat 指令提供了存儲接口的性能名額。
- # iostat
- Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008
- avg-cpu: %user %nice %sys %iowait %idle
- 15.71 0.00 1.07 3.30 79.91
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- cciss/c0d0 4.85 34.82 130.69 307949274 1155708619
- cciss/c0d0p1 0.08 0.21 0.00 1897036 3659
- cciss/c0d0p2 18.11 34.61 130.69 306051650 1155700792
- cciss/c0d1 0.96 13.32 19.75 117780303 174676304
- cciss/c0d1p1 2.67 13.32 19.75 117780007 174676288
- sda 0.00 0.00 0.00 184 0
- sdb 1.03 5.94 18.84 52490104 166623534
- sdc 0.00 0.00 0.00 184 0
- sdd 1.74 38.19 11.49 337697496 101649200
- sde 0.00 0.00 0.00 184 0
- sdf 1.51 34.90 6.80 308638992 60159368
- sdg 0.00 0.00 0.00 184 0
- ... and so on ...
- 輸出的開始部分顯示了可用 CPU 和 I/O 等待時間等名額,與您在 mpstat 指令中看到的相同。
- 輸出的下一部分顯示對系統上每個磁盤裝置非常重要的名額。讓我們看一看這些列的含義:
- tps 每秒的傳輸數量,例如,每秒的 I/O 操作數。注:這隻是 I/O 操作的數量;每個操作可能非常大,也可能非常小。
- Blk_read/s 每秒從該裝置讀取的塊數。通常,塊的大小為 512 位元組。這是一個磁盤使用率較好的值。
- Blk_wrtn/s 每秒寫入該裝置的塊數
- Blk_read 到目前為止從該裝置讀取的塊數。注意,這并不是正在發生的情況。很多塊已經從該裝置讀取。
- 可能現在什麼也沒有讀取。觀察一段時間,看是否有變化。
- Blk_wrtn 寫入該裝置的塊數。
- 在一個擁有很多裝置的系統中,輸出可能需要通過螢幕多次滾動 — 這使得某些内容較難檢查,
- 尤其當您查找特定裝置時更是如此。可以通過将該裝置作為參數傳遞隻獲得特定裝置的名額。
- # iostat sdaj
- Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008
- avg-cpu: %user %nice %sys %iowait %idle
- 15.71 0.00 1.07 3.30 79.91
- Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
- sdaj 1.58 31.93 10.65 282355456 94172401
- 開始部分顯示的 CPU 名額可能沒什麼用處。要取消在輸出開始部分顯示的與 CPU 有關的統計資訊,使用 -d 選項。
- 可以将可選參數放在結尾處,讓 iostat 以固定的時間間隔顯示裝置統計資訊。要每隔 5 秒擷取一次該裝置的統計資訊,共 10 次,執行以下指令:
- # iostat -d sdaj 5 10
- You can display the stats in kilobytes instead of just bytes using the -k option:
- # iostat -k -d sdaj
- Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008
- Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
- sdaj 1.58 15.96 5.32 141176880 47085232
- 盡管以上輸出可能非常有幫助,但很多資訊并不容易顯示。例如,磁盤問題的一個主要原因是磁盤服務時間,
- 即,磁盤将資料送達請求該資料的程序的時間。要獲得該級别的名額,我們需要使用 -x 選項獲得磁盤的“擴充”統計資訊。
- # iostat -x sdaj
- Linux 2.6.9-55.0.9.ELlargesmp (prolin3) 12/27/2008
- avg-cpu: %user %nice %sys %iowait %idle
- 15.71 0.00 1.07 3.30 79.91
- Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
- sdaj 0.00 0.00 1.07 0.51 31.93 10.65 15.96 5.32 27.01 0.01 6.26 6.00 0.95
- 讓我們看一看這些列的含義:
- rrqm/s 每秒合并的讀請求數。磁盤請求排成隊列。隻要可能,核心就會嘗試将多個請求合并成一個請求。
- 該名額測量讀取傳輸的合并請求數。
- wrqm/s 與讀取類似,這是合并的寫請求數。
- r/s 每秒向該裝置發出的讀請求數
- w/s 同樣,它是每秒向該裝置發出的寫請求數
- rsec/s 每秒從該裝置讀取的扇區數
- wsec/s 每秒寫入該裝置的扇區數
- rkB/s 每秒從該裝置讀取的資料,以 KB/秒為機關
- wkB/s 寫入該裝置的資料,以 kb/s 為機關
- avgrq-sz 讀請求的平均大小(扇區數)
- avgqu-sz 該裝置的請求隊列的平均長度
- await 裝置發出 I/O 請求經過的平均時間,以毫秒為機關。這是服務時間與隊列中的等待時間的總和。
- svctm 裝置的平均服務時間,以毫秒為機關
- %util 裝置的帶寬使用率。如果該值接近于 100%,則表明該裝置已飽和。
- 用法
- 可以使用這些指令的組合從輸出中擷取一些有意義的資訊。記住,在從程序擷取請求時磁盤速度可能很慢。磁盤中的資料到達隊列所花費的時間稱為服務時間。如果您想找出服務時間最長的磁盤,執行以下指令:
- # iostat -x | sort -nrk13
- sdat 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 18.80 0.00 64.06 64.05 0.00
- sdv 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.16 0.00 18.03 17.64 0.00
- sdak 0.00 0.00 0.00 0.14 0.00 1.11 0.00 0.55 8.02 0.00 17.00 17.00 0.24
- sdm 0.00 0.00 0.00 0.19 0.01 1.52 0.01 0.76 8.06 0.00 16.78 16.78 0.32
- ... and so on ...
- 這表明磁盤 sdat 的服務時間最長(64.05 毫秒)。為什麼時間這麼長呢?可能性很多,但最可能的原因有三個:
- 該磁盤擷取了大量請求,以至于平均服務時間長。
- 該磁盤利用已移到可能的最大帶寬。
- 該磁盤原本速度就很慢。
- 檢視輸出,我們看到讀取數/秒和寫入數/秒為 0.00(幾乎沒有發生任何事件),是以我們可以排除第一種可能性。
- 使用率也為 0.00%(最後一列),是以我們可以排除第二種可能性。這就剩下了第三種可能性。
- 但得出該磁盤原本速度慢的結論之前,我們需要更加仔細地觀察該磁盤。
- 我們可以隻檢查該磁盤,每隔 5 秒 檢查一次,共 10 次。
- # iostat -x sdat 5 10
- 如果輸出顯示相同的平均服務時間、讀取速率和使用率,則可以斷定最有可能是第三種情況。
- 如果這些數值發生了變化,我們可以擷取更詳細的線索來了解該裝置服務時間較長的原因。
- 同樣,可以對讀取速率列進行排序,以顯示處于恒定讀取速率下的磁盤。
- # iostat -x | sort -nrk6
- sdj 0.00 0.00 1.86 0.61 56.78 12.80 28.39 6.40 28.22 0.03 10.69 9.99 2.46
- sdah 0.00 0.00 1.66 0.52 50.54 10.94 25.27 5.47 28.17 0.02 10.69 10.00 2.18
- sdd 0.00 0.00 1.26 0.48 38.18 11.49 19.09 5.75 28.48 0.01 3.57 3.52 0.61
- ... and so on ...
- 該資訊可以幫助您查找“熱”磁盤,即進行很多讀取或寫入的磁盤。如果該磁盤的确“熱”,
- 則應确定“熱”的原因;可能是該磁盤上定義的某個檔案系統正在進行大量讀取操作。如果是這種情況,
- 則應考慮将該檔案系統在多個磁盤之間進行條帶化,以分發負載,進而最大程度地減小某個特定磁盤“熱”的可能性。