黃頁 網(wǎng)站模板微信營銷的方法7種
磁盤性能指標(biāo)–IOPS、吞吐量(轉(zhuǎn))
一、概念介紹:
磁盤性能指標(biāo)–IOPS
IOPS (Input/Output Per Second)即每秒的輸入輸出量(或讀寫次數(shù)),是衡量磁盤性能的主要指標(biāo)之一。IOPS是指單位時間內(nèi)系統(tǒng)能處理的I/O請求數(shù)量,一般以每秒處理的I/O請求數(shù)量為單位,I/O請求通常為讀或?qū)憯?shù)據(jù)操作請求。
隨機讀寫頻繁的應(yīng)用,如小文件存儲(圖片)、OLTP數(shù)據(jù)庫、郵件服務(wù)器,關(guān)注隨機讀寫性能,IOPS是關(guān)鍵衡量指標(biāo)。
順序讀寫頻繁的應(yīng)用,傳輸大量連續(xù)數(shù)據(jù),如電視臺的視頻編輯,視頻點播VOD(Video On Demand),關(guān)注連續(xù)讀寫性能。數(shù)據(jù)吞吐量是關(guān)鍵衡量指標(biāo)。
IOPS和數(shù)據(jù)吞吐量適用于不同的場合:
讀取10000個1KB文件,用時10秒 Throught(吞吐量)=1MB/s ,IOPS=1000 追求IOPS
讀取1個10MB文件,用時0.2秒 Throught(吞吐量)=50MB/s, IOPS=5 追求吞吐量
磁盤服務(wù)時間
————————————–>普通
磁盤是機械裝置,如FC, SAS, SATA磁盤,轉(zhuǎn)速通常為5400/7200/10K/15K rpm不等。影響磁盤的關(guān)鍵因素是磁盤服務(wù)時間,即磁盤完成一個I/O請求所花費的時間,它由尋道時間、旋轉(zhuǎn)延遲和數(shù)據(jù)傳輸時間三部分構(gòu)成。
尋道時間 Tseek是指將讀寫磁頭移動至正確的磁道上所需要的時間。尋道時間越短,I/O操作越快,目前磁盤的平均尋道時間一般在3-15ms。
旋轉(zhuǎn)延遲 Trotation是指盤片旋轉(zhuǎn)將請求數(shù)據(jù)所在扇區(qū)移至讀寫磁頭下方所需要的時間。旋轉(zhuǎn)延遲取決于磁盤轉(zhuǎn)速,通常使用磁盤旋轉(zhuǎn)一周所需時間的1/2表示。比如,7200 rpm的磁盤平均旋轉(zhuǎn)延遲大約為60*1000/7200/2 = 4.17ms,而轉(zhuǎn)速為15000 rpm的磁盤其平均旋轉(zhuǎn)延遲為2ms。
數(shù)據(jù)傳輸時間 Ttransfer是指完成傳輸所請求的數(shù)據(jù)所需要的時間,它取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率。目前IDE/ATA能達到133MB/s,SATA II可達到300MB/s的接口數(shù)據(jù)傳輸率,數(shù)據(jù)傳輸時間通常遠小于前兩部分消耗時間。簡單計算時可忽略。
常見磁盤平均物理尋道時間為:
7200轉(zhuǎn)/分的STAT硬盤平均物理尋道時間是9ms
10000轉(zhuǎn)/分的STAT硬盤平均物理尋道時間是6ms
15000轉(zhuǎn)/分的SAS硬盤平均物理尋道時間是4ms
常見硬盤的旋轉(zhuǎn)延遲時間為:
7200 rpm的磁盤平均旋轉(zhuǎn)延遲大約為60*1000/7200/2 = 4.17ms
10000 rpm的磁盤平均旋轉(zhuǎn)延遲大約為60*1000/10000/2 = 3ms,
15000 rpm的磁盤其平均旋轉(zhuǎn)延遲約為60*1000/15000/2 = 2ms。
最大IOPS的理論計算方法
IOPS = 1000 ms/ (尋道時間 + 旋轉(zhuǎn)延遲)??梢院雎詳?shù)據(jù)傳輸時間。
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數(shù)值會受到很多因素的影響,包括I/O負(fù)載特征(讀寫比例,順序和隨機,工作線程數(shù),隊列深度,數(shù)據(jù)記錄大小)、系統(tǒng)配置、操作系統(tǒng)、磁盤驅(qū)動等等。因此對比測量磁盤IOPS時,必須在同樣的測試基準(zhǔn)下進行,即便如此也會產(chǎn)生一定的隨機不確定性。
隊列深度說明
NCQ、SCSI TCQ、PATA TCQ和SATA TCQ技術(shù)解析
是一種命令排序技術(shù),一把喂給設(shè)備更多的IO請求,讓電梯算法和設(shè)備有機會來安排合并以及內(nèi)部并行處理,提高總體效率。
SCSI TCQ的隊列深度支持256級
ATA TCQ的隊列深度支持32級 (需要8M以上的緩存)
NCQ最高可以支持命令深度級數(shù)為32級,NCQ可以最多對32個命令指令進行排序。
大多數(shù)的軟件都是屬于同步I/O軟件,也就是說程序的一次I/O要等到上次I/O操作的完成后才進行,這樣在硬盤中同時可能僅只有一個命令,也是無法發(fā)揮這個技術(shù)的優(yōu)勢,這時隊列深度為1。
隨著Intel的超線程技術(shù)的普及和應(yīng)用環(huán)境的多任務(wù)化,以及異步I/O軟件的大量涌現(xiàn)。這項技術(shù)可以被應(yīng)用到了,實際隊列深度的增加代表著性能的提高。
在測試時,隊列深度為1是主要指標(biāo),大多數(shù)時候都參考1就可以。實際運行時隊列深度也一般不會超過4.
IOPS可細(xì)分為如下幾個指標(biāo):
數(shù)據(jù)量為n字節(jié),隊列深度為k時,隨機讀取的IOPS
數(shù)據(jù)量為n字節(jié),隊列深度為k時,隨機寫入的IOPS
二、舉例測試:
UOS公有云開放以來,一些用戶反應(yīng)用dd命令測試出來的1TB云硬盤的吞吐率(MBPS)只有128MB/s,而不是我們SLA保證的170MB /s ,這是為什么?下面我會簡單介紹如何測試硬盤,RAID,SAN,SSD,云硬盤等,然后再來回答上面的問題。
測試前提
我們在進行測試時,都會分清楚:
測試對象:要區(qū)分硬盤、SSD、RAID、SAN、云硬盤等,因為它們有不同的特點
測試指標(biāo):IOPS和MBPS(吞吐率),下面會具體闡述
測試工具:Linux下常用Fio、dd工具, Windows下常用IOMeter,
測試參數(shù): IO大小,尋址空間,隊列深度,讀寫模式,隨機/順序模式
測試方法:也就是測試步驟。
測試是為了對比,所以需要定性和定量。在宣布自己的測試結(jié)果時,需要說明這次測試的工具、參數(shù)、方法,以便于比較。
測試工具 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數(shù)據(jù)包進行連續(xù)讀的情況下:
SSD其速度可以達到404MB/S,IOPS達到103K/S
SAS其速度可以達到190MB/S,IOPS達到41K/S
SATA其速度可以達到124MB/S,IOPS達到31K/S
順序讀,SAS總體表現(xiàn)是SATA硬盤的1.3倍,SSD總體表現(xiàn)是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總體表現(xiàn)是SATA硬盤的4倍,SSD總體表現(xiàn)是sata硬盤的一千多倍。
順序?qū)?
測試命令: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數(shù)據(jù)包順序?qū)懙那闆r下,SSD卡的成績?yōu)?92MB/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數(shù)據(jù)包隨機寫操作中,SSD卡再次展示了其高超的IO性能,高達549MB/S的隨機寫速率,IOPS高達140K。相比之下,本地硬盤的隨機讀寫僅為548KB/S,IOPS為134。
存儲系統(tǒng)模型
為了更好的測試,我們需要先了解存儲系統(tǒng),塊存儲系統(tǒng)本質(zhì)是一個排隊模型,我們可以拿銀行作為比喻。還記得你去銀行辦事時的流程嗎?
去前臺取單號
等待排在你之前的人辦完業(yè)務(wù)
輪到你去某個柜臺
柜臺職員幫你辦完手續(xù)1
柜臺職員幫你辦完手續(xù)2
柜臺職員幫你辦完手續(xù)3
辦完業(yè)務(wù),從柜臺離開
如何評估銀行的效率呢:
服務(wù)時間 = 手續(xù)1 + 手續(xù)2 + 手續(xù)3
響應(yīng)時間 = 服務(wù)時間 + 等待時間
性能 = 單位時間內(nèi)處理業(yè)務(wù)數(shù)量
那銀行如何提高效率呢:
增加柜臺數(shù)
降低服務(wù)時間
因此,排隊系統(tǒng)或存儲系統(tǒng)的優(yōu)化方法是
增加并行度
降低服務(wù)時間
硬盤測試
硬盤原理
我們應(yīng)該如何測試SATA/SAS硬盤呢?
每個硬盤都有一個磁頭(相當(dāng)于銀行的柜臺),硬盤的工作方式是:
收到IO請求,得到地址和數(shù)據(jù)大小
移動磁頭(尋址)
找到相應(yīng)的磁道(尋址)
讀取數(shù)據(jù)
傳輸數(shù)據(jù)
則磁盤的隨機IO服務(wù)時間:
服務(wù)時間 = 尋道時間 + 旋轉(zhuǎn)時間 + 傳輸時間
對于10000轉(zhuǎn)速的SATA硬盤來說,一般尋道時間是7 ms,旋轉(zhuǎn)時間是3 ms, 64KB的傳輸時間是 0.8 ms, 則SATA硬盤每秒可以進行隨機IO操作是 1000/(7 + 3 + 0.8) = 93,所以我們估算SATA硬盤64KB隨機寫的IOPS是93。一般的硬盤廠商都會標(biāo)明順序讀寫的MBPS。
我們在列出IOPS時,需要說明IO大小,尋址空間,讀寫模式,順序/隨機,隊列深度。我們一般常用的IO大小是4KB,這是因為文件系統(tǒng)常用的塊大小是4KB。
使用dd測試硬盤
雖然硬盤的性能是可以估算出來的,但是怎么才能讓應(yīng)用獲得這些性能呢?對于測試工具來說,就是如何得到IOPS和MBPS峰值。我們先用dd測試一下SATA硬盤的MBPS(吞吐量)。
d if=/dev/zero of=/dev/sdd bs=4k count=300000 oflag=direct
記錄了300000+0 的讀入 記錄了300000+0 的寫出 1228800000字節(jié)(1.2 GB)已復(fù)制,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%以上,還有部分時間是空閑的。當(dāng)dd在前一個IO響應(yīng)之后,在準(zhǔn)備發(fā)起下一個IO時,SATA硬盤是空閑的。那么如何才能提高利用率,讓磁盤不空閑呢?只有一個辦法,那就是增加硬盤的隊列深度。相對于CPU來說,硬盤屬于慢速設(shè)備,所有操作系統(tǒng)會有給每個硬盤分配一個專門的隊列用于緩沖IO請求。
隊列深度
什么是磁盤的隊列深度?
在某個時刻,有N個inflight的IO請求,包括在隊列中的IO請求、磁盤正在處理的IO請求。N就是隊列深度。
加大硬盤隊列深度就是讓硬盤不斷工作,減少硬盤的空閑時間。
加大隊列深度 -> 提高利用率 -> 獲得IOPS和MBPS峰值 -> 注意響應(yīng)時間在可接受的范圍內(nèi)
增加隊列深度的辦法有很多
使用異步IO,同時發(fā)起多個IO請求,相當(dāng)于隊列中有多個IO請求
多線程發(fā)起同步IO請求,相當(dāng)于隊列中有多個IO請求
增大應(yīng)用IO大小,到達底層之后,會變成多個IO請求,相當(dāng)于隊列中有多個IO請求 隊列深度增加了。
隊列深度增加了,IO在隊列的等待時間也會增加,導(dǎo)致IO響應(yīng)時間變大,這需要權(quán)衡。讓我們通過增加IO大小來增加dd的隊列深度,看有沒有效果:
dd if=/dev/zero of=/dev/sdd bs=2M count=1000 oflag=direct
記錄了1000+0 的讀入 記錄了1000+0 的寫出 2097152000字節(jié)(2.1 GB)已復(fù)制,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去查一下內(nèi)核參數(shù) max_sectors_kb的意義和使用方法 )
也就是說增加隊列深度,是可以測試出硬盤的峰值的。
使用fio測試硬盤
現(xiàn)在,我們來測試下SATA硬盤的4KB隨機寫的IOPS。因為我的環(huán)境是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的參數(shù)
ioengine: 負(fù)載引擎,我們一般使用libaio,發(fā)起異步IO請求。
bs: IO大小
direct: 直寫,繞過操作系統(tǒng)Cache。因為我們測試的是硬盤,而不是操作系統(tǒng)的Cache,所以設(shè)置為1。
rw: 讀寫模式,有順序?qū)憌rite、順序讀read、隨機寫randwrite、隨機讀randread等。
size: 尋址空間,IO會落在 [0, size)這個區(qū)間的硬盤空間上。這是一個可以影響IOPS的參數(shù)。一般設(shè)置為硬盤的大小。
filename: 測試對象
iodepth: 隊列深度,只有使用libaio時才有意義。這是一個可以影響IOPS的參數(shù)。
runtime: 測試時長
下面我們做兩次測試,分別 iodepth = 1和iodepth = 4的情況。下面是iodepth = 1的測試結(jié)果。
上圖中藍色方框里面的是測出的IOPS 230, 綠色方框里面是每個IO請求的平均響應(yīng)時間,大約是4.3ms。*黃色框表示95%的IO請求的響應(yīng)時間是小于等于 9.920 ms。橙色方框表示該硬盤的利用率已經(jīng)達到了98.58%。
下面是 iodepth = 4 的測試:
我們發(fā)現(xiàn)這次測試的IOPS沒有提高,反而IO平均響應(yīng)時間變大了,是17ms。
為什么這里提高隊列深度沒有作用呢,原因當(dāng)隊列深度為1時,硬盤的利用率已經(jīng)達到了98%,說明硬盤已經(jīng)沒有多少空閑時間可以壓榨了。而且響應(yīng)時間為 4ms。 對于SATA硬盤,當(dāng)增加隊列深度時,并不會增加IOPS,只會增加響應(yīng)時間。這是因為硬盤只有一個磁頭,并行度是1, 所以當(dāng)IO請求隊列變長時,每個IO請求的等待時間都會變長,導(dǎo)致響應(yīng)時間也變長。
這是以前用IOMeter測試一塊SATA硬盤的4K隨機寫性能,可以看到IOPS不會隨著隊列深度的增加而增加,反而是平均響應(yīng)時間在倍增。
隊列深度 | IOPS | 平均響應(yīng)時間 |
---|---|---|
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的影響
我們繼續(xù)測試SATA硬盤,前面我們提到尋址空間參數(shù)也會對IOPS產(chǎn)生影響,下面我們就測試當(dāng)size=1GB時的情況。
T3
我們發(fā)現(xiàn),當(dāng)設(shè)置size=1GB時,IOPS會顯著提高到568,IO平均響應(yīng)時間會降到7ms(隊列深度為4)。這是因為當(dāng)尋址空間為1GB時,磁頭需要移動的距離變小了,每次IO請求的服務(wù)時間就降低了,這就是空間局部性原理。假如我們測試的RAID卡或者是磁盤陣列(SAN),它們可能會用Cache把這1GB的數(shù)據(jù)全部緩存,極大降低了IO請求的服務(wù)時間(內(nèi)存的寫操作比硬盤的寫操作快很1000倍)。所以設(shè)置尋址空間為1GB的意義不大,因為我們是要測試硬盤的全盤性能,而不是Cache的性能。
硬盤優(yōu)化
硬盤廠商提高硬盤性能的方法主要是降低服務(wù)時間(延遲):
提高轉(zhuǎn)速(降低旋轉(zhuǎn)時間和傳輸時間)
增加Cache(降低寫延遲,但不會提高IOPS)
提高單磁道密度(變相提高傳輸時間)
RAID測試
RAID0/RAID5/RAID6的多塊磁盤可以同時服務(wù),其實就是提高并行度,這樣極大提高了性能(相當(dāng)于銀行有多個柜臺)。
以前測試過12塊RAID0,100GB的尋址空間,4KB隨機寫,逐步提高隊列深度,IOPS會提高,因為它有12塊磁盤(12個磁頭同時工作),并行度是12。
隊列深度 | IOPS | 平均響應(yīng)時間 |
---|---|---|
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卡廠商優(yōu)化的方法也是降低服務(wù)時間:
使用大內(nèi)存Cache
使用IO處理器,降低XOR操作的延遲。
使用更大帶寬的硬盤接口
SAN測試
對于低端磁盤陣列,使用單機IOmeter就可以測試出它的IOPS和MBPS的峰值,但是對于高端磁盤陣列,就需要多機并行測試才能得到IOPS和MBPS的峰值(IOmeter支持多機并行測試)。
磁盤陣列廠商通過以下手段降低服務(wù)時間:
更快的存儲網(wǎng)絡(luò),比如FC和IB,延時更低。
讀寫Cache。寫數(shù)據(jù)到Cache之后就馬上返回,不需要落盤。 而且磁盤陣列有更多的控制器和硬盤,大大提高了并行度。
現(xiàn)在的存儲廠商會找SPC幫忙測試自己的磁盤陣列產(chǎn)品(或全閃存陣列), 并給SPC支付費用,這就是赤裸裸的標(biāo)準(zhǔn)壟斷。國內(nèi)也有做存儲系統(tǒng)測試的,假如你要測試磁盤陣列,可以找NSTC (廣告時間)。
SSD測試
SSD的延時很低,并行度很高(多個nand塊同時工作),缺點是壽命和GC造成的響應(yīng)時間不穩(wěn)定。
推薦用IOMeter進行測試,使用大隊列深度,并進行長時間測試,這樣可以測試出SSD的真實性能。
下圖是storagereview對一些SSD硬盤做的4KB隨機寫的長時間測試,可以看出有些SSD硬盤的最大響應(yīng)時間很不穩(wěn)定,會飆高到幾百ms,這是不可接受的。
云硬盤測試
我們通過兩方面來提高云硬盤的性能的:
降低延遲(使用SSD,使用萬兆網(wǎng)絡(luò),優(yōu)化代碼,減少瓶頸)
提高并行度(數(shù)據(jù)分片,同時使用整個集群的所有SSD)
在Linux下測試云硬盤
在Linux下,你可以使用FIO來測試
操作系統(tǒng):Ubuntu 14.04
CPU: 2
Memory: 2GB
云硬盤大小: 1TB(SLA: 6000 IOPS, 170MB/s吞吐率 )
安裝fio:
sudo apt-get install fio
再次介紹一下FIO的測試參數(shù):
ioengine: 負(fù)載引擎,我們一般使用libaio,發(fā)起異步IO請求。
bs: IO大小
direct: 直寫,繞過操作系統(tǒng)Cache。因為我們測試的是硬盤,而不是操作系統(tǒng)的Cache,所以設(shè)置為1。
rw: 讀寫模式,有順序?qū)憌rite、順序讀read、隨機寫randwrite、隨機讀randread等。
size: 尋址空間,IO會落在 [0, size)這個區(qū)間的硬盤空間上。這是一個可以影響IOPS的參數(shù)。一般設(shè)置為硬盤的大小。
filename: 測試對象
iodepth: 隊列深度,只有使用libaio時才有意義。這是一個可以影響IOPS的參數(shù)。
runtime: 測試時長
4K隨機寫測試
我們首先進行4K隨機寫測試,測試參數(shù)和測試結(jié)果如下所示:
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=100G -filename=/dev/vdb
-name=”EBS 4KB randwrite test” -iodepth=32 -runtime=60
藍色方框表示IOPS是5900,在正常的誤差范圍內(nèi)。綠色方框表示IO請求的平均響應(yīng)時間為5.42ms, 黃色方框表示95%的IO請求的響應(yīng)時間是小于等于 6.24 ms的。
4K隨機讀測試
我們再來進行4K隨機讀測試,測試參數(shù)和測試結(jié)果如下所示:
fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=100G -filename=/dev/vdb
-name=”EBS 4KB randread test” -iodepth=8 -runtime=60
512KB順序?qū)憸y試
最后我們來測試512KB順序?qū)?#xff0c;看看云硬盤的最大MBPS(吞吐率)是多少,測試參數(shù)和測試結(jié)果如下所示:
fio -ioengine=libaio -bs=512k -direct=1 -thread -rw=write -size=100G -filename=/dev/vdb
-name=”EBS 512KB seqwrite test” -iodepth=64 -runtime=60
藍色方框表示MBPS為174226KB/s,約為170MB/s。
使用dd測試吞吐率
其實使用dd命令也可以測試出170MB/s的吞吐率,不過需要設(shè)置一下內(nèi)核參數(shù),詳細(xì)介紹在 128MB/s VS 170MB/s 章節(jié)中。
在Windows下測試云硬盤
在Windows下,我們一般使用IOMeter測試磁盤的性能,IOMeter不僅功能強大,而且很專業(yè),是測試磁盤性能的首選工具。
IOMeter是圖形化界面(濃濃的MFC框架的味道),非常方便操作,下面我將使用IOMeter測試我們UOS上1TB的云硬盤。
操作系統(tǒng):Window Server 2012 R2 64
CPU: 4
Memory: 8GB
云硬盤大小: 1TB
當(dāng)你把云硬盤掛載到Windows主機之后,你還需要在windows操作系統(tǒng)里面設(shè)置硬盤為聯(lián)機狀態(tài)。
4K隨機寫測試
打開IOMeter(你需要先下載),你會看到IOMeter的主界面。在右邊,你回發(fā)現(xiàn)4個worker(數(shù)量和CPU個數(shù)相同),因為我們現(xiàn)在只需要1個worker,所以你需要把其他3個worker移除掉。
現(xiàn)在讓我們來測試硬盤的4K隨機寫,我們選擇好硬盤(Red Hat VirtIO 0001),設(shè)置尋址空間(Maximum Disk Size)為50GB(每個硬盤扇區(qū)大小是512B,所以一共是 50*1024*1024*1024/512 = 104857600),設(shè)置隊列深度(Outstanding I/Os)為64。
然后在測試集中選擇”4KiB ALIGNED; 0% Read; 100% random(4KB對齊,100%隨機寫操作)” 測試
然后設(shè)置測試時間,我們設(shè)置測試時長為60秒,測試之前的預(yù)熱時間為10秒(IOMeter會發(fā)起負(fù)載,但是不統(tǒng)計這段時間的結(jié)果)。
在最后測試之前,你可以設(shè)置查看實時結(jié)果,設(shè)置實時結(jié)果的更新頻率是5秒鐘。最后點擊綠色旗子開始測試。
在測試過程中,我們可以看到實時的測試結(jié)果,當(dāng)前的IOPS是6042,平均IO請求響應(yīng)時間是10.56ms,這個測試還需要跑38秒,這個測試輪回只有這個測試。
我們可以看到IOMeter自動化程度很高,極大解放測試人員的勞動力,而且可以導(dǎo)出CSV格式的測試結(jié)果。
順序讀寫測試
我們再按照上面的步驟,進行了順序讀/寫測試。下面是測試結(jié)果:
IO大小 | 讀寫模式 | 隊列深度 | MBPS |
---|---|---|---|
順序?qū)懲掏聹y試 | 512KB | 順序?qū)?/td> | 64 |
順序讀吞吐測試 | 256KB | 順序讀 | 64 |
云硬盤的響應(yīng)時間
當(dāng)前云硬盤寫操作的主要延遲是
網(wǎng)絡(luò)傳輸
多副本,寫三份(數(shù)據(jù)強一致性)
三份數(shù)據(jù)都落盤(數(shù)據(jù)持久化)之后,才返回
IO處理邏輯
我們當(dāng)前主要是優(yōu)化IO處理邏輯,并沒有去優(yōu)化2和3,這是因為我們是把用戶數(shù)據(jù)的安全性放在第一位。
128MB/s VS 170MB/s
回到最開始的問題 “為什么使用dd命令測試云硬盤只有128MB/s”, 這是因為目前云硬盤在處理超大IO請求時的延遲比SSD高(我們會不斷進行優(yōu)化),現(xiàn)在我們有兩種方法來獲得更高的MBPS:
設(shè)置max_sectors_kb為256 (系統(tǒng)默認(rèn)為512),降低延遲
使用fio來測試,加大隊列深度
通過設(shè)置max_sectors_kb這個參數(shù),使用dd也可以測出170MB/s的吞吐量
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請求的延遲:
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工具的測試結(jié)果,也可以得到170MB/s的吞吐率。
不可測試的指標(biāo)
IOPS和MBPS是用戶可以使用工具測試的指標(biāo),云硬盤還有一些用戶不可測量的指標(biāo)
數(shù)據(jù)一致性
數(shù)據(jù)持久性
數(shù)據(jù)可用性
這些指標(biāo)我們只能通過根據(jù)系統(tǒng)架構(gòu)和約束條件計算得到,然后轉(zhuǎn)告給用戶。這些指標(biāo)衡量著公有云廠商的良心,有機會會專門進行介紹。
總結(jié)
測試需要定性和定量
了解存儲模型可以幫助你更好的進行測試
增加隊列深度可以有效測試出IOPS和MBPS的峰值