磁盤 IOPS(每秒讀寫次數) 的計算方法


 

一、磁盤 I/O 的概念 

        I/O 的概念,從字義來理解就是輸入輸出。操作系統從上層到底層,各個層次之間均存在 I/O。比如,CPU 有 I/O,內存有 I/O, VMM 有 I/O, 底層磁盤上也有 I/O,這是廣義上的 I/O。通常來講,一個上層的 I/O 可能會產生針對磁盤的多個 I/O,也就是說,上層的 I/O 是稀疏的,下層的 I/O 是密集的。 

        磁盤的 I/O,顧名思義就是磁盤的輸入輸出。輸入指的是對磁盤寫入數據,輸出指的是從磁盤讀出數據。我們常見的磁盤類型有 ATA、SATA、FC、SCSI、SAS,如圖1所示。這幾種磁盤中,服務器常用的是 
SAS 和 FC 磁盤,一些高端存儲也使用 SSD 盤。每一種磁盤的性能是不一樣的。

圖 1. 物理磁盤的架構以及常見磁盤類型 


二、性能評價指標 

        SAN(Storage Area Network, 存儲區域網絡)和NAS存儲(Network Attached Storage,網絡附加存儲)一般都具備2個評價指標:IOPS和帶寬(throughput),兩個指標互相獨立又相互關聯。體現存儲系統性能的最主要指標是IOPS。下面,將介紹一下這兩個參數的含義。 

        IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,I/O請求通常為讀或寫數據操作請求。隨機讀寫頻繁的應用,如OLTP(Online Transaction Processing),IOPS是關鍵衡量指標。另一個重要指標是數據吞吐量(Throughput),指單位時間內可以成功傳輸的數據數量。對於大量順序讀寫的應用,如VOD(Video On Demand),則更關注吞吐量指標。 

        簡而言之: 
                磁盤的 IOPS,也就是在一秒內,磁盤進行多少次 I/O 讀寫。 
                磁盤的吞吐量,也就是每秒磁盤 I/O 的流量,即磁盤寫入加上讀出的數據的大小。 

        IOPS 與吞吐量的關系 
                每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE。從公式可以看出: I/O SIZE 越大,IOPS 越高,那么每秒 I/O 的吞吐量就越高。因此,我們會認為 IOPS 和吞吐量的數值越高越好。實際上,對於一個磁盤來講,這兩個參數均有其最大值,而且這兩個參數也存在着一定的關系。 

        IOPS可細分為如下幾個指標: 
                1. Toatal IOPS,混合讀寫和順序隨機I/O負載情況下的磁盤IOPS,這個與實際I/O情況最為相符,大多數應用關注此指標。 
                2. Random Read IOPS,100%隨機讀負載情況下的IOPS。 
                3. Random Write IOPS,100%隨機寫負載情況下的IOPS。 
                4. Sequential Read IOPS,100%順序讀負載情況下的IOPS。 
                5. Sequential Write IOPS,100%順序寫負載情況下的IOPS。 

        下圖為一個典型的NFS測試結果:

        IOPS的測試benchmark工具主要有Iometer, IoZone, FIO等,可以綜合用於測試磁盤在不同情形下的IOPS。對於應用系統,需要首先確定數據的負載特征,然后選擇合理的IOPS指標進行測量和對比分析,據此選擇合適的存儲介質和軟件系統。

        IOPS計算公式 
        對於磁盤來說一個完整的IO操作是這樣進行的:當控制器對磁盤發出一個IO操作命令的時候,磁盤的驅動臂(Actuator Arm)帶讀寫磁頭(Head)離開着陸區(Landing Zone,位於內圈沒有數據的區域),移動到要操作的初始數據塊所在的磁道(Track)的正上方,這個過程被稱為尋址(Seeking),對應消耗的時間被稱為尋址時間(Seek Time);但是找到對應磁道還不能馬上讀取數據,這時候磁頭要等到磁盤盤片(Platter)旋轉到初始數據塊所在的扇區(Sector)落在讀寫磁頭正上方的之后才能開始讀取數據,在這個等待盤片旋轉到可操作扇區的過程中消耗的時間稱為旋轉延時(Rotational Delay);接下來就隨着盤片的旋轉,磁頭不斷的讀/寫相應的數據塊,直到完成這次IO所需要操作的全部數據,這個過程稱為數據傳送(Data Transfer),對應的時間稱為傳送時間(Transfer Time)。完成這三個步驟之后一次IO操作也就完成了。 

       

        在我們看硬盤廠商的宣傳單的時候我們經常能看到3個參數,分別是平均尋址時間盤片旋轉速度以及最大傳送速度,這三個參數就可以提供給我們計算上述三個步驟的時間。 

        第一個尋址時間,考慮到被讀寫的數據可能在磁盤的任意一個磁道,既有可能在磁盤的最內圈(尋址時間最短),也可能在磁盤的最外圈(尋址時間最長),所以在計算中我們只考慮平均尋址時間,也就是磁盤參數中標明的那個平均尋址時間,這里就采用當前最多的10krmp硬盤的5ms。 

        第二個旋轉延時,和尋址一樣,當磁頭定位到磁道之后有可能正好在要讀寫扇區之上,這時候是不需要額外額延時就可以立刻讀寫到數據,但是最壞的情況確實要磁盤旋轉整整一圈之后磁頭才能讀取到數據,所以這里我們也考慮的是平均旋轉延時,對於10krpm的磁盤就是(60s/10k)*(1/2) = 2ms。

        第三個傳送時間,磁盤參數提供我們的最大的傳輸速度,當然要達到這種速度是很有難度的,但是這個速度卻是磁盤純讀寫磁盤的速度,因此只要給定了單次 IO的大小,我們就知道磁盤需要花費多少時間在數據傳送上,這個時間就是IO Chunk Size / Max Transfer Rate。(數據傳輸率,單位是Mb/s,兆每秒) 


          傳統磁盤本質上一種機械裝置,如FC,SAS,SATA磁盤,轉速通常為5400/7200/10K/15K rpm不等。影響磁盤的關鍵因素是磁盤服務時間,即磁盤完成一個I/O請求所花費的時間,它由尋道時間、旋轉延遲和數據傳輸時間三部分構成。

        尋道時間Tseek是指將讀寫磁頭移動至正確的磁道上所需要的時間。尋道時間越短,I/O操作越快,目前磁盤的平均尋道時間一般在3-15ms。 

        旋轉延遲Trotation是指盤片旋轉將請求數據所在扇區移至讀寫磁頭下方所需要的時間。旋轉延遲取決於磁盤轉速,通常使用磁盤旋轉一周所需時間的1/2表示。比如,7200 rpm的磁盤平均旋轉延遲大約為60*1000/7200/2 = 4.17ms,而轉速為15000 rpm的磁盤其平均旋轉延遲約為2ms。 

       數據傳輸時間Ttransfer是指完成傳輸所請求的數據所需要的時間,它取決於數據傳輸率,其值等於數據大小除以數據傳輸率。目前IDE/ATA能達到133MB/s,SATA II可達到300MB/s的接口數據傳輸率,數據傳輸時間通常遠小於前兩部分時間。

        因此,理論上可以計算出磁盤的最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略數據傳輸時間。假設磁盤平均物理尋道時間為3ms, 磁盤轉速為7200,10K,15K rpm,則磁盤IOPS理論最大值分別為,

        IOPS = 1000 / (3 + 60000/7200/2) = 140

        IOPS = 1000 / (3 + 60000/10000/2) = 167 

        IOPS = 1000 / (3 + 60000/15000/2) = 200

       固態硬盤SSD是一種電子裝置, 避免了傳統磁盤在尋道和旋轉上的時間花費,存儲單元尋址開銷大大降低,因此IOPS可以非常高,能夠達到數萬甚至數十萬。實際測量中,IOPS數值會受到很多因素的影響,包括I/O負載特征(讀寫比例,順序和隨機,工作線程數,隊列深度,數據記錄大小)、系統配置、操作系統、磁盤驅動等等。因此對比測量磁盤IOPS時,必須在同樣的測試基准下進行,即便如何也會產生一定的隨機不確定性。


 

        現在我們就可以得出這樣的計算單次IO時間的公式。 
                IO Time = Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate 
        於是我們可以這樣計算出IOPS。 
          IOPS = 1/IO Time = 1/(Seek Time + 60 sec/Rotational Speed/2 + IO Chunk Size/Transfer Rate) 
        對於給定不同的IO大小我們可以得出下面的一系列的數據 
                4K (1/7.1 ms = 140 IOPS) 
                5ms + (60sec/15000RPM/2) + 4K/40MB = 5 + 2 + 0.1 = 7.1 

        做個說明:尋址時間會直接給出,RPM為轉每分,所以轉化為毫秒,一轉的時間為60*1000/15000=4ms。取4ms的一半為旋轉的旋轉延時。另外4K*1000/40M=0.1;計算過程是40M/s,一秒傳輸40M,即1000ms傳輸40*1024KB≈40*1000KB。傳輸4K則要花費4*1000/40000=0.1ms。一次IO的時間為7.1ms,則1s能夠執行多少個IO,即有多少個7.1ms呢,1000/7.1=140IOPS 
  8k (1/7.2 ms = 139 IOPS) 
  5ms + (60sec/15000RPM/2) + 8K/40MB = 5 + 2 + 0.2 = 7.2 
  16K (1/7.4 ms = 135 IOPS) 
  5ms + (60sec/15000RPM/2) + 16K/40MB = 5 + 2 + 0.4 = 7.4 
  32K (1/7.8 ms = 128 IOPS) 
  5ms + (60sec/15000RPM/2) + 32K/40MB = 5 + 2 + 0.8 = 7.8 
  64K (1/8.6 ms = 116 IOPS) 
  5ms + (60sec/15000RPM/2) + 64K/40MB = 5 + 2 + 1.6 = 8.6 

        從上面的數據可以看出,當單次IO越小的時候,單次IO所耗費的時間也越少,相應的IOPS也就越大。 

        上面我們的數據都是在一個比較理想的假設下得出來的,這里的理想的情況就是磁盤要花費平均大小的尋址時間和平均的旋轉延時,這個假設其實是比較符合我們實際情況中的隨機讀寫,在隨機讀寫中,每次IO操作的尋址時間和旋轉延時都不能忽略不計,有了這兩個時間的存在也就限制了IOPS的大小。現在我們考慮一種相對極端的順序讀寫操作,比如說在讀取一個很大的存儲連續分布在磁盤的的文件,因為文件的存儲的分布是連續的,磁頭在完成一個讀IO操作之后,不需要從新的尋址,也不需要旋轉延時,在這種情況下我們能到一個很大的IOPS值,如下。 

  4K (1/0.1 ms = 10000 IOPS) 
  0ms + 0ms + 4K/40MB = 0.1 
  8k (1/0.2 ms = 5000 IOPS) 
  0ms + 0ms + 8K/40MB = 0.2 
  16K (1/0.4 ms = 2500 IOPS) 
  0ms + 0ms + 16K/40MB = 0.4 
  32K (1/0.8 ms = 1250 IOPS) 
  0ms + 0ms + 32K/40MB = 0.8 
  64K (1/1.6 ms = 625 IOPS) 
  0ms + 0ms + 64K/40MB = 1.6 
        相比第一組數據來說差距是非常的大的,因此當我們要用IOPS來衡量一個IO系統的系能的時候,我們一定要說清楚是在什么情況的IOPS,也就是要說明讀寫的方式以及單次IO的大小,當然在實際當中,特別是在OLTP的系統的,隨機的小IO的讀寫是最有說服力的。 

        另外,對於同一個磁盤(或者 LUN),隨着每次 I/O 讀寫數據的大小不通,IOPS 的數值也不是固定不變的。例如,每次 I/O 寫入或者讀出的都是連續的大數據塊,此時 IOPS 相對會低一些;在不頻繁換道的情況下,每次寫入或者讀出的數據塊小,相對來講 IOPS 就會高一些。也就是說,IOPS 也取決與I/O塊的大小,采用不同I/O塊的大小測出的IOPS值是不同的。 對一個具體的IOPS, 可以了解它當時測試的I/O塊的尺寸。並且IOPS都具有極限值,表1列出了各種磁盤的 IOPS 極限值。 
表 1. 常見磁盤類型及其 IOPS

 

三、I/O 讀寫的類型 

        大體上講,I/O 的類型可以分為:讀 / 寫 I/O、大 / 小塊 I/O、連續 / 隨機 I/O, 順序 / 並發 I/O。在這幾種類型中,我們主要討論一下:大 / 小塊 I/O、連續 / 隨機 I/O, 順序 / 並發 I/O。 

        大 / 小塊 I/O 
        這個數值指的是控制器指令中給出的連續讀出扇區數目的多少。如果數目較多,如 64,128 等,我們可以認為是大塊 I/O;反之,如果很小,比如 4,8,我們就會認為是小塊 I/O,實際上,在大塊和小塊 I/O 之間,沒有明確的界限。 

        連續 / 隨機 I/O 
        連續 I/O 指的是本次 I/O 給出的初始扇區地址和上一次 I/O 的結束扇區地址是完全連續或者相隔不多的。反之,如果相差很大,則算作一次隨機 I/O 
        連續 I/O 比隨機 I/O 效率高的原因是:在做連續 I/O 的時候,磁頭幾乎不用換道,或者換道的時間很短;而對於隨機 I/O,如果這個 I/O 很多的話,會導致磁頭不停地換道,造成效率的極大降低。 

        順序 / 並發 I/O 
        從概念上講,並發 I/O 就是指向一塊磁盤發出一條 I/O 指令后,不必等待它回應,接着向另外一塊磁盤發 I/O 指令。對於具有條帶性的 RAID(LUN),對其進行的 I/O 操作是並發的,例如:raid 0+1(1+0),raid5 等。反之則為順序 I/O。

 

四、磁盤 I/O 性能調優 

        確認磁盤 I/O 存在性能問題 
        對於隨機負載,當遇到余下情況時,我們那通常認為存在 I/O 性能問題: 
                1. 平均讀時間大於 15ms 
                2. 在具有寫 cache 的條件下,平均寫時間大於 2.5ms 
        對於順序負載,當遇到余下情況時,我們那通常認為存在 I/O 性能問題: 
                1. 在一個磁盤上有兩個連續的 I/O 流 
                2. 吞吐量不足(即遠遠小於磁盤 I/O 帶寬) 
        對於一塊磁盤來講,隨着 IOPS 數量的增加,I/O service 也會增加,並且會有一個飽和點,即 IOPS 達到某個點以后,IOPS 再增加將會引起 I/O service time 的顯著增加。 

圖 3. 磁盤 IOPS 與 IO service time 關系圖

        從經驗上講,我們在測試工作中,我們主要關注 IOPS 和吞吐量以及磁盤的 busy% 這三個數值。如果 IOPS 和吞吐量均很低,磁盤的 busy% 也很低,我們會認為磁盤壓力過小,造成吞吐量和 IOPS 過低;只有在 IOPS 和吞吐量均很低,磁盤的 busy% 很高(接近 100%)的時候,我們才會從磁盤 I/O 方面分析 I/O 性能。

 

 

參考:https://blog.csdn.net/lk142500/article/details/78482577


免責聲明!

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



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