Linux服務器I/O性能分析-1


一、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 設備編號
3 sda1  設備名稱
4 428  成功完成的讀取總數
5  合並讀取操作的次數-單獨講解-詳見如下序列5
6 6250   成功讀取的扇區數
7 1329   所有讀取數據花費的總毫秒數
8 12   完成寫入的次數
9  合並寫入的次數
10 29   成功寫入的扇區總數
11  寫入磁盤塊所花費的毫秒數
12  當前正在進行的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性能


免責聲明!

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



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