磁盤性能指標--IOPS、吞吐量及測試


1、概念介紹:
html

磁盤性能指標--IOPS
----------------------------------------------------------
        IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數),是衡量磁盤性能的主要指標之一。IOPS是指單位時間內系統能處理的I/O請求數量,通常以每秒處理的I/O請求數量爲單位,I/O請求一般爲讀或寫數據操做請求。

    隨機讀寫頻繁的應用,如小文件存儲(圖片)、OLTP數據庫、郵件服務器,關注隨機讀寫性能,IOPS是關鍵衡量指標。
    順序讀寫頻繁的應用,傳輸大量連續數據,如電視臺的視頻編輯,視頻點播VOD(Video On Demand),關注連續讀寫性能。數據吞吐量是關鍵衡量指標。

IOPS和數據吞吐量適用於不一樣的場合:
讀取10000個1KB文件,用時10秒  Throught(吞吐量)=1MB/s ,IOPS=1000  追求IOPS
讀取1個10MB文件,用時0.2秒  Throught(吞吐量)=50MB/s, IOPS=5  追求吞吐量

磁盤服務時間
--------------------------------------
傳統磁盤本質上一種機械裝置,如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的接口數據傳輸率,數據傳輸時間一般遠小於前兩部分消耗時間。簡單計算時可忽略。
ios

 

常見磁盤平均物理尋道時間爲:
7200轉/分的STAT硬盤平均物理尋道時間是9ms
10000轉/分的STAT硬盤平均物理尋道時間是6ms
15000轉/分的SAS硬盤平均物理尋道時間是4ms
算法

 

常見硬盤的旋轉延遲時間爲:數據庫

7200  rpm的磁盤平均旋轉延遲大約爲60*1000/7200/2 = 4.17mswindows

10000 rpm的磁盤平均旋轉延遲大約爲60*1000/10000/2 = 3ms,緩存

15000 rpm的磁盤其平均旋轉延遲約爲60*1000/15000/2 = 2ms。安全



最大IOPS的理論計算方法
--------------------------------------
IOPS = 1000 ms/ (尋道時間 + 旋轉延遲)。能夠忽略數據傳輸時間。

7200  rpm的磁盤IOPS = 1000 / (9 + 4.17)  = 76 IOPS
10000 rpm的磁盤IOPS = 1000 / (6+ 3) = 111 IOPS
15000 rpm的磁盤IOPS = 1000 / (4 + 2) = 166 IOPS


影響測試的因素
-----------------------------------------
實際測量中,IOPS數值會受到不少因素的影響,包括I/O負載特徵(讀寫比例,順序和隨機,工做線程數,隊列深度,數據記錄大小)、系統配置、操做系統、磁盤驅動等等。所以對比測量磁盤IOPS時,必須在一樣的測試基準下進行,即使如此也會產生必定的隨機不肯定性。


隊列深度說明 
NCQ、SCSI TCQ、PATA TCQ和SATA TCQ技術解析 
----------------------------------------
    是一種命令排序技術,一把餵給設備更多的IO請求,讓電梯算法和設備有機會來安排合併以及內部並行處理,提升整體效率。
SCSI TCQ的隊列深度支持256級
ATA TCQ的隊列深度支持32級 (須要8M以上的緩存)
NCQ最高能夠支持命令深度級數爲32級,NCQ能夠最多對32個命令指令進行排序。
    大多數的軟件都是屬於同步I/O軟件,也就是說程序的一次I/O要等到上次I/O操做的完成後才進行,這樣在硬盤中同時可能僅只有一個命令,也是沒法發揮這個技術的優點,這時隊列深度爲1。
    隨着Intel的超線程技術的普及和應用環境的多任務化,以及異步I/O軟件的大量涌現。這項技術能夠被應用到了,實際隊列深度的增長表明着性能的提升。
在測試時,隊列深度爲1是主要指標,大多數時候都參考1就能夠。實際運行時隊列深度也通常不會超過4.


IOPS可細分爲以下幾個指標:
-----------------------------------------
數據量爲n字節,隊列深度爲k時,隨機讀取的IOPS
數據量爲n字節,隊列深度爲k時,隨機寫入的IOPS
服務器



2、舉例測試:網絡

UOS公有云開放以來,一些用戶反應用dd命令測試出來的1TB雲硬盤的吞吐率(MBPS)只有128MB/s,而不是咱們SLA保證的170MB /s ,這是爲何?下面我會簡單介紹如何測試硬盤,RAID,SAN,SSD,雲硬盤等,而後再來回答上面的問題。多線程

測試前提

咱們在進行測試時,都會分清楚:

  • 測試對象:要區分硬盤、SSD、RAID、SAN、雲硬盤等,由於它們有不一樣的特色

  • 測試指標:IOPS和MBPS(吞吐率),下面會具體闡述

  • 測試工具:Linux下經常使用Fio、dd工具,  Windows下經常使用IOMeter,

  • 測試參數:  IO大小,尋址空間,隊列深度,讀寫模式,隨機/順序模式

  • 測試方法:也就是測試步驟。

測試是爲了對比,因此須要定性和定量。在宣佈本身的測試結果時,須要說明此次測試的工具、參數、方法,以便於比較。


測試工具 fio:

順序讀

測試命令:fio -name iops -rw=read -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio -direct=1

SATA
Jobs: 1 (f=1): [R] [16.4% done] [124.1M/0K /s] [31.3K/0  iops] [eta 00m:51s]
SAS
Jobs: 1 (f=1): [R] [16.4% done] [190M/0K /s] [41.3K/0  iops] [eta 00m:51s]
SSD
Jobs: 1 (f=1): [R] [100.0% done] [404M/0K /s] [103K /0  iops] [eta 00m:00s]

能夠看到 在對4KB數據包進行連續讀的狀況下:

SSD其速度能夠達到404MB/S,IOPS達到103K/S

SAS其速度能夠達到190MB/S,IOPS達到41K/S

SATA其速度能夠達到124MB/S,IOPS達到31K/S

順序讀,SAS整體表現是SATA硬盤的1.3倍,SSD整體表現是sata硬盤的4倍。

 

隨機讀

測試命令 fio -name iops -rw=randread -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio -direct=1

SATA
Jobs: 1 (f=1): [r] [41.0% done] [466K/0K /s] [114 /0  iops] [eta 00m:36s]
SAS
Jobs: 1 (f=1): [r] [41.0% done] [1784K/0K /s] [456 /0  iops] [eta 00m:36s]
SSD
Jobs: 1 (f=1): [R] [100.0% done] [505M/0K /s] [129K /0  iops] [eta 00m:00s]

隨機讀,SAS整體表現是SATA硬盤的4倍,SSD整體表現是sata硬盤的一千多倍。

 

順序寫

測試命令:fio -name iops -rw=write -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio -direct=1

SATA
Jobs: 1 (f=1): [W] [21.3% done] [0K/124.9M /s] [0 /31.3K iops] [eta 00m:48s]
SAS
Jobs: 1 (f=1): [W] [21.3% done] [0K/190M /s] [0 /36.3K iops] [eta 00m:48s]
SSD
Jobs: 1 (f=1): [W] [100.0% done] [0K/592M /s] [0 /152K  iops] [eta 00m:00s]

一樣的4KB數據包順序寫的狀況下,SSD卡的成績爲592MB/S,IOPS爲152K。而本地硬盤僅爲118MB/S,IOPS僅爲30290。

 

隨機寫

測試命令: fio -name iops -rw=randwrite -bs=4k -runtime=60 -iodepth 32 -filename /dev/sda6 -ioengine libaio -direct=1

SATA
Jobs: 1 (f=1): [w] [100.0% done] [0K/548K /s] [0 /134  iops] [eta 00m:00s]
SAS
Jobs: 1 (f=1): [w] [100.0% done] [0K/2000K /s] [0 /512  iops] [eta 00m:00s]
SSD
Jobs: 1 (f=1): [W] [100.0% done] [0K/549M /s] [0 /140K  iops] [eta 00m:00s]

在接下來的4KB數據包隨機寫操做中,SSD卡再次展現了其高超的IO性能,高達549MB/S的隨機寫速率,IOPS高達140K。相比之下,本地硬盤的隨機讀寫僅爲548KB/S,IOPS爲134。



存儲系統模型

爲了更好的測試,咱們須要先了解存儲系統,塊存儲系統本質是一個排隊模型,咱們能夠拿銀行做爲比喻。還記得你去銀行辦事時的流程嗎?

  1. 去前臺取單號

  2. 等待排在你以前的人辦完業務

  3. 輪到你去某個櫃檯

  4. 櫃檯職員幫你辦完手續1

  5. 櫃檯職員幫你辦完手續2

  6. 櫃檯職員幫你辦完手續3

  7. 辦完業務,從櫃檯離開

如何評估銀行的效率呢:

  • 服務時間 = 手續1 + 手續2 + 手續3

  • 響應時間 = 服務時間 + 等待時間

  • 性能 = 單位時間內處理業務數量

那銀行如何提升效率呢:

  • 增長櫃檯數

  • 下降服務時間

所以,排隊系統或存儲系統的優化方法是

  • 增長並行度

  • 下降服務時間

硬盤測試

硬盤原理

咱們應該如何測試SATA/SAS硬盤呢?

每一個硬盤都有一個磁頭(至關於銀行的櫃檯),硬盤的工做方式是:

  1. 收到IO請求,獲得地址和數據大小

  2. 移動磁頭(尋址)

  3. 找到相應的磁道(尋址)

  4. 讀取數據

  5. 傳輸數據

則磁盤的隨機IO服務時間:

服務時間 = 尋道時間 + 旋轉時間 + 傳輸時間

對於10000轉速的SATA硬盤來講,通常尋道時間是7 ms,旋轉時間是3 ms, 64KB的傳輸時間是 0.8 ms, 則SATA硬盤每秒能夠進行隨機IO操做是 1000/(7 + 3 + 0.8) = 93,因此咱們估算SATA硬盤64KB隨機寫的IOPS是93。通常的硬盤廠商都會標明順序讀寫的MBPS。

咱們在列出IOPS時,須要說明IO大小,尋址空間,讀寫模式,順序/隨機,隊列深度。咱們通常經常使用的IO大小是4KB,這是由於文件系統經常使用的塊大小是4KB。

使用dd測試硬盤

雖然硬盤的性能是能夠估算出來的,可是怎麼才能讓應用得到這些性能呢?對於測試工具來講,就是如何獲得IOPS和MBPS峯值。咱們先用dd測試一下SATA硬盤的MBPS(吞吐量)。

#dd if=/dev/zero of=/dev/sdd bs=4k count=300000 oflag=direct
記錄了300000+0 的讀入 記錄了300000+0 的寫出 1228800000字節(1.2 GB)已複製,17.958 秒,68.4 MB/秒
#iostat -x sdd 5 10
...
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 0.00 0.00 0.00 16794.80 0.00 134358.40 8.00 0.79 0.05 0.05 78.82...

爲何這塊硬盤的MBPS只有68MB/s? 這是由於磁盤利用率是78%,沒有到達95%以上,還有部分時間是空閒的。當dd在前一個IO響應以後,在準備發起下一個IO時,SATA硬盤是空閒的。那麼如何才能提升利用率,讓磁盤不空閒呢?只有一個辦法,那就是增長硬盤的隊列深度。相對於CPU來講,硬盤屬於慢速設備,全部操做系統會有給每一個硬盤分配一個專門的隊列用於緩衝IO請求。

隊列深度

什麼是磁盤的隊列深度?

在某個時刻,有N個inflight的IO請求,包括在隊列中的IO請求、磁盤正在處理的IO請求。N就是隊列深度。

加大硬盤隊列深度就是讓硬盤不斷工做,減小硬盤的空閒時間。

加大隊列深度 -> 提升利用率 -> 得到IOPS和MBPS峯值 -> 注意響應時間在可接受的範圍內

增長隊列深度的辦法有不少

  • 使用異步IO,同時發起多個IO請求,至關於隊列中有多個IO請求

  • 多線程發起同步IO請求,至關於隊列中有多個IO請求

  • 增大應用IO大小,到達底層以後,會變成多個IO請求,至關於隊列中有多個IO請求 隊列深度增長了。

隊列深度增長了,IO在隊列的等待時間也會增長,致使IO響應時間變大,這須要權衡。讓咱們經過增長IO大小來增長dd的隊列深度,看有沒有效果:

dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct
記錄了1000+0 的讀入 記錄了1000+0 的寫出 2097152000字節(2.1 GB)已複製,10.6663 秒,197 MB/秒
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdd 0.00 0.00 0.00 380.60 0.00 389734.40 1024.00 2.39 6.28 2.56 97.42

能夠看到2MB的IO到達底層以後,會變成多個512KB的IO,平均隊列長度爲2.39,這個硬盤的利用率是97%,MBPS達到了197MB/s。(爲何會變成512KB的IO,你能夠去使用Google去查一下內核參數 max_sectors_kb的意義和使用方法 )

    也就是說增長隊列深度,是能夠測試出硬盤的峯值的。

使用fio測試硬盤

如今,咱們來測試下SATA硬盤的4KB隨機寫的IOPS。由於個人環境是Linux,因此我使用FIO來測試。

$fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=1000G -filename=/dev/vdb 
-name="EBS 4K randwrite test" -iodepth=64 -runtime=60

簡單介紹fio的參數

  • ioengine: 負載引擎,咱們通常使用libaio,發起異步IO請求。

  • bs: IO大小

  • direct: 直寫,繞過操做系統Cache。由於咱們測試的是硬盤,而不是操做系統的Cache,因此設置爲1。

  • rw: 讀寫模式,有順序寫write、順序讀read、隨機寫randwrite、隨機讀randread等。

  • size: 尋址空間,IO會落在 [0, size)這個區間的硬盤空間上。這是一個能夠影響IOPS的參數。通常設置爲硬盤的大小。

  • filename: 測試對象

  • iodepth: 隊列深度,只有使用libaio時纔有意義。這是一個能夠影響IOPS的參數。

  • runtime: 測試時長

下面咱們作兩次測試,分別 iodepth = 1和iodepth = 4的狀況。下面是iodepth = 1的測試結果。

wKioL1Y8tyOQ_VT0AAwb2pYQdVM197.jpg


上圖中藍色方框裏面的是測出的IOPS 230, 綠色方框裏面是每一個IO請求的平均響應時間,大約是4.3ms。***方框表示95%的IO請求的響應時間是小於等於 9.920 ms。橙色方框表示該硬盤的利用率已經達到了98.58%。

下面是 iodepth = 4 的測試:

wKiom1Y8tuLSQKm3AAtLnv7AfHU575.jpg

咱們發現此次測試的IOPS沒有提升,反而IO平均響應時間變大了,是17ms。

爲何這裏提升隊列深度沒有做用呢,緣由當隊列深度爲1時,硬盤的利用率已經達到了98%,說明硬盤已經沒有多少空閒時間能夠壓榨了。並且響應時間爲 4ms。 對於SATA硬盤,當增長隊列深度時,並不會增長IOPS,只會增長響應時間。這是由於硬盤只有一個磁頭,並行度是1, 因此當IO請求隊列變長時,每一個IO請求的等待時間都會變長,致使響應時間也變長。

這是之前用IOMeter測試一塊SATA硬盤的4K隨機寫性能,能夠看到IOPS不會隨着隊列深度的增長而增長,反而是平均響應時間在倍增。

隊列深度 IOPS 平均響應時間
1 332.931525 3.002217
2 333.985074 5.986528
4 332.594653 12.025060
8 336.568012 23.766359
16 329.785606 48.513477
32 332.054590 96.353934
64 331.041063 193.200815
128 331.309109 385.163111
256 327.442963 774.401781

尋址空間對IOPS的影響

咱們繼續測試SATA硬盤,前面咱們提到尋址空間參數也會對IOPS產生影響,下面咱們就測試當size=1GB時的狀況。

wKioL1Y8t5CRhdDFAAr7AKiVUWg866.jpg

咱們發現,當設置size=1GB時,IOPS會顯著提升到568,IO平均響應時間會降到7ms(隊列深度爲4)。這是由於當尋址空間爲1GB時,磁頭須要移動的距離變小了,每次IO請求的服務時間就下降了,這就是空間局部性原理。假如咱們測試的RAID卡或者是磁盤陣列(SAN),它們可能會用Cache把這1GB的數據所有緩存,極大下降了IO請求的服務時間(內存的寫操做比硬盤的寫操做快很1000倍)。因此設置尋址空間爲1GB的意義不大,由於咱們是要測試硬盤的全盤性能,而不是Cache的性能。

硬盤優化

硬盤廠商提升硬盤性能的方法主要是下降服務時間(延遲):

  • 提升轉速(下降旋轉時間和傳輸時間)

  • 增長Cache(下降寫延遲,但不會提升IOPS)

  • 提升單磁道密度(變相提升傳輸時間)

RAID測試

RAID0/RAID5/RAID6的多塊磁盤能夠同時服務,其實就是提升並行度,這樣極大提升了性能(至關於銀行有多個櫃檯)。

之前測試過12塊RAID0,100GB的尋址空間,4KB隨機寫,逐步提升隊列深度,IOPS會提升,由於它有12塊磁盤(12個磁頭同時工做),並行度是12。

隊列深度 IOPS 平均響應時間
1 1215.995842 0.820917
2 4657.061317 0.428420
4 5369.326970 0.744060
8 5377.387303 1.486629
16 5487.911660 2.914048
32 5470.972663 5.846616
64 5520.234015 11.585251
128 5542.739816 23.085843
256 5513.994611 46.401606

RAID卡廠商優化的方法也是下降服務時間:

  • 使用大內存Cache

  • 使用IO處理器,下降XOR操做的延遲。

  • 使用更大帶寬的硬盤接口

 

SAN測試

對於低端磁盤陣列,使用單機IOmeter就能夠測試出它的IOPS和MBPS的峯值,可是對於高端磁盤陣列,就須要多機並行測試才能獲得IOPS和MBPS的峯值(IOmeter支持多機並行測試)。


磁盤陣列廠商經過如下手段下降服務時間:

  1. 更快的存儲網絡,好比FC和IB,延時更低。

  2. 讀寫Cache。寫數據到Cache以後就立刻返回,不須要落盤。 並且磁盤陣列有更多的控制器和硬盤,大大提升了並行度。

如今的存儲廠商會找SPC幫忙測試本身的磁盤陣列產品(或全閃存陣列), 並給SPC支付費用,這就是赤裸裸的標準壟斷。國內也有作存儲系統測試的,假如你要測試磁盤陣列,能夠找NSTC (廣告時間)。

SSD測試

SSD的延時很低,並行度很高(多個nand塊同時工做),缺點是壽命和GC形成的響應時間不穩定。

推薦用IOMeter進行測試,使用大隊列深度,並進行長時間測試,這樣能夠測試出SSD的真實性能。

下圖是storagereview對一些SSD硬盤作的4KB隨機寫的長時間測試,能夠看出有些SSD硬盤的最大響應時間很不穩定,會飆高到幾百ms,這是不可接受的。

wKiom1Y8t6XQEgumAAOSXSrl6lw550.jpg

雲硬盤測試

咱們經過兩方面來提升雲硬盤的性能的:

  1. 下降延遲(使用SSD,使用萬兆網絡,優化代碼,減小瓶頸)

  2. 提升並行度(數據分片,同時使用整個集羣的全部SSD)

在Linux下測試雲硬盤

在Linux下,你可使用FIO來測試

  • 操做系統:Ubuntu 14.04

  • CPU: 2

  • Memory: 2GB

  • 雲硬盤大小: 1TB(SLA: 6000 IOPS, 170MB/s吞吐率  )

安裝fio:

#sudo apt-get install fio

再次介紹一下FIO的測試參數:

  • ioengine: 負載引擎,咱們通常使用libaio,發起異步IO請求。

  • bs: IO大小

  • direct: 直寫,繞過操做系統Cache。由於咱們測試的是硬盤,而不是操做系統的Cache,因此設置爲1。

  • rw: 讀寫模式,有順序寫write、順序讀read、隨機寫randwrite、隨機讀randread等。

  • size: 尋址空間,IO會落在 [0, size)這個區間的硬盤空間上。這是一個能夠影響IOPS的參數。通常設置爲硬盤的大小。

  • filename: 測試對象

  • iodepth: 隊列深度,只有使用libaio時纔有意義。這是一個能夠影響IOPS的參數。

  • runtime: 測試時長

4K隨機寫測試

咱們首先進行4K隨機寫測試,測試參數和測試結果以下所示:

#fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=100G -filename=/dev/vdb 
-name="EBS 4KB randwrite test" -iodepth=32 -runtime=60

wKioL1Y8uCvD55pOAAwRhXg8VDA961.jpg

藍色方框表示IOPS是5900,在正常的偏差範圍內。綠色方框表示IO請求的平均響應時間爲5.42ms, ***方框表示95%的IO請求的響應時間是小於等於 6.24 ms的。

4K隨機讀測試

咱們再來進行4K隨機讀測試,測試參數和測試結果以下所示:

#fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=100G -filename=/dev/vdb 
-name="EBS 4KB randread test" -iodepth=8 -runtime=60

wKiom1Y8uAnCHGi_AAs0C7gUM3M086.jpg

512KB順序寫測試

最後咱們來測試512KB順序寫,看看雲硬盤的最大MBPS(吞吐率)是多少,測試參數和測試結果以下所示:

#fio -ioengine=libaio -bs=512k -direct=1 -thread -rw=write -size=100G -filename=/dev/vdb 
-name="EBS 512KB seqwrite test" -iodepth=64 -runtime=60

 wKioL1Y8uGWQWsc9AA8F64mKDiw637.jpg

藍色方框表示MBPS爲174226KB/s,約爲170MB/s。

使用dd測試吞吐率

其實使用dd命令也能夠測試出170MB/s的吞吐率,不過須要設置一下內核參數,詳細介紹在 128MB/s VS 170MB/s 章節中。

在Windows下測試雲硬盤

在Windows下,咱們通常使用IOMeter測試磁盤的性能,IOMeter不只功能強大,並且很專業,是測試磁盤性能的首選工具。

IOMeter是圖形化界面(濃濃的MFC框架的味道),很是方便操做,下面我將使用IOMeter測試咱們UOS上1TB的雲硬盤。

  • 操做系統:Window Server 2012 R2 64

  • CPU: 4

  • Memory: 8GB

  • 雲硬盤大小: 1TB

當你把雲硬盤掛載到Windows主機以後,你還須要在windows操做系統裏面設置硬盤爲聯機狀態。

wKiom1Y8uFuTu841AAuob-frz4E556.jpg

4K隨機寫測試

打開IOMeter(你須要先下載),你會看到IOMeter的主界面。在右邊,你回發現4個worker(數量和CPU個數相同),由於咱們如今只須要1個worker,因此你須要把其餘3個worker移除掉。

 wKioL1Y8uNKgQhdGAAX0U2ZLDfI422.jpg

如今讓咱們來測試硬盤的4K隨機寫,咱們選擇好硬盤(Red Hat VirtIO 0001),設置尋址空間(Maximum Disk Size)爲50GB(每一個硬盤扇區大小是512B,因此一共是 50*1024*1024*1024/512 = 104857600),設置隊列深度(Outstanding I/Os)爲64。

wKiom1Y8uK2ihq5cAAaN4dBZnsw341.jpg

 而後在測試集中選擇」4KiB ALIGNED; 0% Read; 100% random(4KB對齊,100%隨機寫操做)」 測試

wKioL1Y8uQ3Qskb6AAmBxowHtZ0092.jpg

而後設置測試時間,咱們設置測試時長爲60秒,測試以前的預熱時間爲10秒(IOMeter會發起負載,可是不統計這段時間的結果)。

wKioL1Y8uSmilTNjAAdO3cQBrY0082.jpg

在最後測試以前,你能夠設置查看實時結果,設置實時結果的更新頻率是5秒鐘。最後點擊綠色旗子開始測試。

wKiom1Y8uSXxx-ueAAgBcvjOxNw430.jpg

在測試過程當中,咱們能夠看到實時的測試結果,當前的IOPS是6042,平均IO請求響應時間是10.56ms,這個測試還須要跑38秒,這個測試輪迴只有這個測試。

wKioL1Y8uYKSnIsCAAgawftaNVE622.jpg

咱們能夠看到IOMeter自動化程度很高,極大解放測試人員的勞動力,並且能夠導出CSV格式的測試結果。

順序讀寫測試

咱們再按照上面的步驟,進行了順序讀/寫測試。下面是測試結果:


IO大小 讀寫模式 隊列深度 MBPS
順序寫吞吐測試 512KB 順序寫 64 164.07 MB/s
順序讀吞吐測試 256KB 順序讀 64 179.32 MB/s

雲硬盤的響應時間

當前雲硬盤寫操做的主要延遲是

  1. 網絡傳輸

  2. 多副本,寫三份(數據強一致性)

  3. 三份數據都落盤(數據持久化)以後,才返回

  4. IO處理邏輯

咱們當前主要是優化IO處理邏輯,並無去優化2和3,這是由於咱們是把用戶數據的安全性放在第一位。

128MB/s VS 170MB/s

回到最開始的問題 「爲何使用dd命令測試雲硬盤只有128MB/s」, 這是由於目前雲硬盤在處理超大IO請求時的延遲比SSD高(咱們會不斷進行優化),如今咱們有兩種方法來得到更高的MBPS:

  1. 設置max_sectors_kb爲256 (系統默認爲512),下降延遲

  2. 使用fio來測試,加大隊列深度

經過設置max_sectors_kb這個參數,使用dd也能夠測出170MB/s的吞吐量

root@ustack:~# cat /sys/block/vdb/queue/max_sectors_kb
512
root@ustack:~# echo "256" > /sys/block/vdb/queue/max_sectors_kb
root@ustack:~#
root@ustack:~# dd if=/dev/zero of=/dev/vdb bs=32M count=40  oflag=direct
40+0 records in
40+0 records out
1342177280 bytes (1.3 GB) copied, 7.51685 s, 179 MB/s
root@ustack:~#

同時查看IO請求的延遲:

root@ustack:~# iostat -x vdb 5 100
...
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm  %util
vdb     0.00  0.00 0.00 688.00 0.00 176128.00  512.00 54.59  93.47 0.00 93.47 1.40  96.56

下面是使用fio工具的測試結果,也能夠獲得170MB/s的吞吐率。
wKiom1Y8uVyBlQURAA8F64mKDiw214.jpg

不可測試的指標

IOPS和MBPS是用戶可使用工具測試的指標,雲硬盤還有一些用戶不可測量的指標

  1. 數據一致性

  2. 數據持久性

  3. 數據可用性

這些指標咱們只能經過根據系統架構和約束條件計算獲得,而後轉告給用戶。這些指標衡量着公有云廠商的良心,有機會會專門進行介紹。

總結

上面介紹了一下測試工具和一些觀點,但願對你有所幫助。

  • 測試須要定性和定量

  • 瞭解存儲模型能夠幫助你更好的進行測試

  • 增長隊列深度能夠有效測試出IOPS和MBPS的峯值

相關文章
相關標籤/搜索