一、IOSTAT誤區
1.1 誤區-svctm
Linux上的svctm是重要的I/O指標(I/O平均服務時間-單位毫秒),這個值直接反映了硬件的性能(I/O請求從SCSI層發出--->I/O完成之后返回SCSI層所消耗的時間),要是這個值很大的話,那肯定是硬件出問題了,但是Linux系統對他的解釋卻有點出乎意料:
man iostat ...... The average service time (in milliseconds) for I/O requests that were issued to the device. Warning! Do not trust this fieldany more. This field will be removed in a future sysstat version. ...... # 說白了就是這個值已經不權威了,將來sysstat包中他就沒了(找誰說理去)
1.2 誤區-await
雖然說I/O平均消耗時間(毫秒)是用await表示的,但是這個值也不能說明硬件的性能(那我要你干什么,就是不行唄),經過研究后發現await不僅包括硬件設備處理I/O時間,還包括了在請求隊列里面的時間,排隊時間又不是硬件設備消耗的,那憑什么硬件要背鍋;所以這個值也不能全信,也有可能是內核驅動I/O調度器(/sys/block/sda-z/queue/scheduler)的時候導致這個值變大了。問題來了,這也不能信那也不能信,我信你妹啊,到底怎么弄?答案是:想要分析真正的原因就別指望它了
二、被騙后的反思
2.1 文件:/proc/diskstats
要真正理解I/O輸出結果,應該看這個文件(一次沒看懂就看二次三次四次.....關機)
cat /proc/diskstats 8 0 sda 12600 81 692064 28041 32735156 176165 2096398965 1926343 0 800601 1948300 8 1 sda1 428 0 6250 1329 12 1 29 0 0 161 1329 8 2 sda2 616 0 11438 137 119 0 32452 5 0 113 142 8 3 sda3 11468 81 669992 26550 32735025 176164 2096366484 1926338 0 800359 1946760 8 16 sdb 0 0 0 0 0 0 0 0 0 0 0
2.1.1 字段解釋
8 1 sda1 428 0 6250 1329 12 1 29 0 0 161 1329
字段序列 | 字段值 | 字段含義 |
1 | 8 | SCSI設備尋址地址 |
2 | 1 | 設備編號 |
3 | sda1 | 設備名稱 |
4 | 428 | 成功完成的讀取總數 |
5 | 0 | 合並讀取操作的次數-單獨講解-詳見如下序列5 |
6 | 6250 | 成功讀取的扇區數 |
7 | 1329 | 所有讀取數據花費的總毫秒數 |
8 | 12 | 完成寫入的次數 |
9 | 1 | 合並寫入的次數 |
10 | 29 | 成功寫入的扇區總數 |
11 | 0 | 寫入磁盤塊所花費的毫秒數 |
12 | 0 | 當前正在進行的I/O數量,這個數量是I/O進入隊列時進行++的,還沒到磁盤 |
13 | 161 | I/O花費的毫秒數(讀消耗的時間+寫消耗的時間) |
14 | 1329 | 執行I/O的加權毫秒數-單獨講解-詳見如下序列14 |
2.1.2 字段解釋
- 字段序列5:
合並讀取操作的次數,就是要是一個應用讀取的數據塊相鄰時,可以合並成一個,這樣能提高效率(調度器負責合並),官方文檔翻譯:兩次4K讀取可能先變為一次8K讀取,最終移交給磁盤,因此將被計數(並排隊),僅作為一個I/O。該字段使您知道執行此操作的頻率。
- 字段序列14:
執行I/O的加權毫秒數,該字段在每次I/O開始,I/O完成,I/O時遞增,通過進行中的I/O數量合並或讀取這些統計信息(字段9)乘以自I/O以來花費的毫秒數,該字段的最新更新。這樣可以輕松衡量,I/O完成時間和可能積壓的積壓。
三、對IOSTAT的看法
3.1 概述
iostat是以/proc/diskstats為基礎進行計算的,因為它沒有把隊列等待時間和硬盤處理時間分開計算,所以凡是一些計算I/O的工具要是以這個文件為基礎的話,那取出的數據都不准確!
3.2 iostat字段解釋
iostat -x ...... 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.02 0.00 3.08 0.03 98.52 64.04 0.00 0.06 2.23 0.06 0.02 0.01 # rrqm/s : 每秒對該設備的讀請求被合並次數,文件系統會對讀取同塊(block)的請求進行合並 # wrqm/s : 每秒對該設備的寫請求被合並次數 # r/s : 每秒完成的讀次數 # w/s : 每秒完成的寫次數 # rkB/s : 每秒讀數據量(kB為單位) # wkB/s : 每秒寫數據量(kB為單位) # avgrq-sz : 平均每次IO操作的數據量(扇區數為單位) # avgqu-sz : 平均等待處理的IO請求隊列長度 # await : 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位) # r_await : 每個讀操作平均所需的時間(不僅包括硬盤設備讀操作的時間,還包括了在kernel隊列中等待的時間。) # w_await : 每個寫操作平均所需的時間(不僅包括硬盤設備寫操作的時間,還包括了在kernel隊列中等待的時間。) # svctm : 平均每次IO請求的處理時間(毫秒為單位) # %util : 采用周期內用於IO操作的時間比率,即IO隊列非空的時間比率
下一節繼續分享如何正確分析I/O性能