iostat詳解


1 iostat簡介

iostat命令是Linux系統上查看I/O性能最基本的工具,其全稱為 I/O statistics。iostat能統計磁盤活動情況,也能統計CPU使用情況。
iostat屬於sysstat軟件包,可以通過命令進行安裝:

yum install sysstat -y

iostat數據的來源是Linux操作系統的/proc/diskstats:

cat /proc/diskstats

8 0 sda 239219 1806 37281259 2513275 904326 88832 50268824 26816609 0 4753060 29329105
8 1 sda1 338 0 53241 6959 154 0 5496 3724 0 6337 10683
8 2 sda2 238695 1797 37226458 2504489 620322 88832 50263328 25266599 0 3297988 27770221
8 16 sdb 1009117 481 1011773 127319 0 0 0 0 0 126604 126604
8 17 sdb1 1008792 480 1010929 127078 0 0 0 0 0 126363 126363
253 0 dm-0 1005 0 8040 15137 30146 0 241168 2490230 0 30911 2505369
253 1 dm-1 192791 0 35500457 2376087 359162 0 44095600 22949466 0 2312433 25325563
253 2 dm-2 47132 0 1717329 183565 496207 0 5926560 7348763 0 2517753 7532688

注意,procfs中的前三個字段:主設備號、從設備號、設備名。

從第四個字段開始,介紹的是該設備的相關統計:

iostat 1 3:每隔 1秒刷新顯示,且顯示3次
iostat -d sda1:顯示指定磁盤信息
iostat -t:顯示tty和Cpu信息
iostat -m:以M為單位顯示所有信息
iostat -d -k 1 1:查看TPS和吞吐量信息
iostat -d -x -k 1 1:查看設備使用率(%util)、響應時間(await)
iostat -c 1 3:查看cpu狀態,每隔 1秒刷新顯示,且顯示3次

iostat有以下缺陷:

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

2 命令與參數項

2.1 命令格式

iostat[參數][時間][次數]
例如,iostat -d -x -k 1 3:每1s采集一次數據,顯示3次,以kb為單位顯示磁盤使用情況詳細信息。

2.2 參數詳解

-x 顯示詳細信息
-C 顯示CPU使用情況,與-d選項互斥
-d 顯示磁盤使用情況,與-C選項互斥
-k 以 KB 為單位顯示
-m 以 M 為單位顯示
-N 顯示磁盤陣列(LVM) 信息
-n 顯示NFS 使用情況
-p[磁盤] 顯示磁盤和分區的情況
-t 顯示終端和CPU的信息
-V 顯示版本信息

3 輸出項目說明

使用iostat后,結果面板如下:

[root@k8s-master ~]# iostat
Linux 3.10.0-1160.el7.x86_64 (k8s-master)       2021年12月28日  _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.07    0.02    2.74    0.05    0.00   92.13

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              17.00         1.84       107.25   17965102 1046002151
dm-0             17.16         1.84       107.25   17932023 1045999467
dm-1              0.00         0.00         0.00       3240          0

3.1 cpu屬性

iostat結果面板 avg-cpu 描述的是系統cpu使用情況:

%user:CPU處在用戶模式下的時間百分比。
%nice:CPU處在帶NICE值的用戶模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完成時間的百分比。
%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
%idle:CPU空閑時間百分比。

3.2 磁盤屬性

iostat結果面板 Device 項描述的是系統磁盤使用情況:

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:寫入的總數量數據量;

4 使用實例

4.1 查看磁盤詳情

命令:iostat -d -x -k 1 1

[root@k8s-master ~]# iostat -d -x -k 1 1
Linux 3.10.0-1160.el7.x86_64 (k8s-master)       2021年12月28日  _x86_64_        (4 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.16    0.07   16.94     1.84   107.25    12.83     0.07    3.90  190.94    3.18   0.15   0.26
dm-0              0.00     0.00    0.07   17.10     1.84   107.25    12.71     0.07    3.96  192.56    3.25   0.15   0.26
dm-1              0.00     0.00    0.00    0.00     0.00     0.00    50.62     0.00    6.96    6.96    0.00   6.76   0.00

結果說明:

rrqm/s:每秒合並讀操作的次數,如果兩個讀操作讀取相鄰的數據塊時,可以被合並成一個,以提高效率。合並的操作通常是I/O scheduler(也叫elevator)負責的。
wrqm/s:每秒合並寫操作的次數
r/s:每秒讀操作的次數
w/s:每秒寫操作的次數
rKB/s:每秒讀取的字節數(KB)
wKB/s:每秒寫入的字節數(KB)
rkB/s:每秒讀K字節數,是 rsect/s 的一半,因為每扇區大小為512字節(需要計算)
wkB/s:每秒寫K字節數,是 wsect/s 的一半(需要計算)
avgrq-sz:每個IO的平均扇區數,即所有請求的平均大小,以扇區(512字節)為單位
avgqu-sz:平均未完成的IO請求數量,即平均意義上的請求隊列長度
await:平均每個IO所需要的時間,包括在隊列等待的時間,也包括磁盤控制器處理本次請求的有效時間
r_await:每個讀操作平均所需要的時間,不僅包括硬盤設備讀操作的時間,也包括在內核隊列中的時間。
w_wait:每個寫操平均所需要的時間,不僅包括硬盤設備寫操作的時間,也包括在隊列中等待的時間。
svctm:表面看是每個IO請求的服務時間,不包括等待時間,但是實際上,這個指標已經廢棄。實際上,iostat工具沒有任何一輸出項表示的是硬盤設備平均每次IO的時間。
%util:表示該設備有I/O(即非空閑)的時間比率,不考慮I/O有多少,只考慮有沒有。

4.2 其他

iostat 1 3:每隔 1秒刷新顯示,且顯示3次
iostat -d sda1:顯示指定磁盤信息
iostat -t:顯示tty和Cpu信息
iostat -m:以M為單位顯示所有信息
iostat -d -k 1 1:查看TPS和吞吐量信息
iostat -d -x -k 1 1:查看設備使用率(%util)、響應時間(await)
iostat -c 1 3:查看cpu狀態,每隔 1秒刷新顯示,且顯示3次

5 深入解析

5.1 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。

5.2 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大大加快了,如果磁盤陣列的寫操作不在一兩個毫秒以內就算慢的了;讀操作則未必,不在緩存中的數據仍然需要讀取物理硬盤,單個小數據塊的讀取速度跟單盤差不多。

5.3 %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有沒有哪個指標可以衡量硬盤設備的飽和程度呢?很遺憾,沒有。

轉:https://cloud.tencent.com/developer/article/1698369


免責聲明!

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



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