分布式對象存儲系統(tǒng)Sheepdog性能測試
Sheepdog是一個分布式對象存儲系統(tǒng),專為虛擬機提供塊存儲,號稱無單點、零配置、可線性擴展(省略更多優(yōu)點介紹)。本文主要關注其性能究竟如何,測試版本為目前的***穩(wěn)定版0.7.4。
測試環(huán)境
- 節(jié)點數(shù)量:6個
- 磁盤:各節(jié)點都配備7200轉SATA硬盤,型號WDC WD10EZEX-22RKKA0,容量為1TB,另外測試節(jié)點(即用于啟動虛擬客戶機的宿主機)多配置一塊SSD硬盤,型號INTEL SSDSA2CW300G3,容量為300GB
- 網(wǎng)絡:測試節(jié)點配備PCI-E雙千兆網(wǎng)卡,通過bonding進行負載均衡
- 文件系統(tǒng):ext4fs,掛載參數(shù):rw,noatime,barrier=0,user_xattr,data=writeback
- sheepdog集群
- 可用空間:6個節(jié)點各分配100GB,總共600GB
- 對象副本數(shù)量:3個,客戶機實際***可用空間為200GB,接近項目規(guī)劃的容量
- 對象緩存:使用SSD硬盤,分配256GB,可完全緩存客戶機文件系統(tǒng),隨測試項目需要掛載或卸載
- 虛擬客戶機
- 資源:4GB內(nèi)存,4個邏輯CPU
- 使用qemu 1.7啟動,支持KVM加速、virtio
- 兩大測試項目
- IOPS:主要考察較小數(shù)據(jù)塊 隨機讀和寫的能力,測試工具fio(sudo apt-get install fio),測試文件固定為150GB
- 吞吐量:主要考察較大數(shù)據(jù)塊 順序讀或者寫的能力,測試工具iozone(sudo apt-get install iozone3),測試文件從64MB倍數(shù)遞增到4GB,如沒有特別說明,測試結果取自操作512MB的數(shù)據(jù)文件
除特別說明,qemu啟動虛擬客戶機命令如下:
qemu-system-x86_64 --enable-kvm -m 4096 -smp 4 -drive file=sheepdog:mint,if=virtio,index=0 \ -drive file=sheepdog:data,if=virtio,index=1 -net nic,model=virtio -net user -vnc :1 -daemonize
IOPS測試
測試須知
關于SATA硬盤的IOPS
測試用的普通7200轉SATA硬盤,官方公布其平均尋道時間10.5毫秒,所以,根據(jù)以下公式,理論上的IOPS值最多只有65。
實測結果,在單線程同步IO的情況下(下圖深藍線),也是65,在多任務(紫線)或者使用異步IO(黃線)的情況下,由于操作系統(tǒng)IO調(diào)度,IOPS能夠達到80到100之間。如果進行讀寫操作的文件遠遠小于SATA磁盤大小,縮小了存儲單元尋址范圍,減少了全磁盤尋道時間,也能提高IOPS,例如,測試文件大小占磁盤大小的1/8的時候,IOPS***在90左右(淺藍線)。
關于SSD硬盤的IOPS
測試用的SSD硬盤,在單線程同步IO的情況下,IOPS最多能夠達到9000左右(下圖深藍線),在多任務(紫線)或者異步IO(黃線)的情況下,最多能夠達到40000-50000之間。由于構造原理不同于傳統(tǒng)磁盤,減小測試文件大小并不能明顯提高IOPS。
關于讀寫比例
由于大多數(shù)業(yè)務場景既有讀操作,也有寫操作,而且一般讀操作比寫操作多很多,因此,讀寫混合測試項目中的讀寫比例設定為4:1。一般業(yè)務很少有完全隨機寫的情況,因此不進行只寫測試。
關于電梯算法
虛擬的客戶機操作系統(tǒng)的IO調(diào)度算法使用noop,網(wǎng)上有資料能夠提高IOPS,但是實測效果不明顯,因此最終報告并沒有把它單列出來。
IOPS測試1:不使用對象緩存,只讀測試
單線程同步IO的情況下(下圖深藍線),sheepdog的IOPS差不多達到100,比單節(jié)點單SATA硬盤高,究其原因:客戶機中的測試文件為150GB,共有三個副本,即共占450GB,集群有6個節(jié)點,平均每個節(jié)點75GB,而各個節(jié)點所在磁盤容量為1TB,僅占其1/13,因此,無其它IO任務的情況下,IOPS會比全磁盤隨機操作高。
減少客戶機的測試文件大小為原來的1/8,即19GB,IOPS能夠達到130-140左右,驗證了無其它IO任務的情況下,測試文件越小,IOPS越高(淺藍線)。
恢復客戶機的測試文件為150GB,在多任務(線程數(shù)量為10,紫線)或者異步IO(隊列深度為10,黃線)的情況下,IOPS可達230-250。
250左右是否該sheepdog集群的極限?進一步換其它numjob和iodepth的組合進行測試,答案是肯定的,測試結果都在250左右,以下是線程數(shù)量為8,異步IO隊列深度分別為1、4、16、64、256的測試結果,線程數(shù)量增加到16,測試數(shù)據(jù)并沒有提高。
IOPS測試2:使用對象緩存,只讀測試
單線程同步IO、使用對象緩存且緩存命中率100%的情況下(下圖藍線),sheepdog的IOPS***可達6000,對比相同條件下SSD硬盤的測試結果(***9000),還是有些損耗。
通過多任務(紫線)或者異步IO(黃線)的方式提高并發(fā)IO數(shù)量,在緩存命中率100%的情況下,IOPS可以提高到40000-50000,基本與相同條件下SSD硬盤的測試結果相當。
注意上圖為對數(shù)刻度,且沒有數(shù)據(jù)值,很難比較數(shù)值大小,下圖省略了一半數(shù)據(jù)塊,但是標上了數(shù)據(jù)值。
之所以強調(diào)緩存命中率,是因為在不完全命中緩存的時候,IOPS下降很厲害,低于80%的話,可能還不如沒有對象緩存。下圖是sheepdog對象緩存命中率與IOPS的關系圖,其中,測試的數(shù)據(jù)塊大小從512B倍數(shù)遞增到512KB,緩存命中率是在測試過程中,根據(jù)sheepdog的cache目錄中已有的對象文件數(shù)量估算的平均值,IOPS值是讀取數(shù)據(jù)塊操作在估算的緩存命中率條件下測量的平均值。
50000是否該sheepdog集群的極限?仿照上面的方法進行測試,答案也是肯定的,測試結果都在50000以內(nèi),以下是線程數(shù)量為8,異步IO隊列深度分別為1、4、16、64、256的測試結果,線程數(shù)量增加到16,測試數(shù)據(jù)并沒有提高。
IOPS測試3:不使用對象緩存,讀寫混合測試
讀寫混合測試的IOPS比只讀測試的結果,總的來說要低一些,而且起伏較大,需要多次測試計算其平均值。
單線程同步IO的情況下(下圖深藍線),能夠達到80-100。
減少客戶機的測試文件大小為原來的1/8,即19GB,IOPS能夠達到100-120(淺藍線)。
恢復客戶機的測試文件為150GB,在多任務(線程數(shù)量為10,紫線)或者異步IO(隊列深度為10,黃線)的情況下,IOPS大多在180-250之間,但也有時候只到160左右。
IOPS測試4:使用對象緩存,讀寫混合測試
單線程同步IO、使用對象緩存且緩存命中率100%的情況下,IOPS差不多達到4000。
通過多任務或者異步IO的方式提高并發(fā)IO數(shù)量,在緩存命中率100%的情況下,IOPS可達10000-20000之間。
注意上圖為對數(shù)刻度,且沒有數(shù)據(jù)值,下圖省略了一半數(shù)據(jù)塊,但是標上了數(shù)據(jù)值??梢钥吹?,大數(shù)據(jù)塊讀寫混合的情況下,多任務或異步IO的IOPS可能還不如單任務同步IO
吞吐量測試
測試須知
關于SATA硬盤的吞吐量
普通7200轉SATA硬盤的吞吐量數(shù)據(jù),對比一下后面SSD硬盤的吞吐量數(shù)據(jù),說明傳統(tǒng)磁盤順序讀寫的能力還是相當出色的。
關于SSD硬盤的吞吐量
大數(shù)據(jù)塊(512KB以上)順序讀,吞吐量可達250MB/s-270MB/s,順序寫,吞吐量可達200MB/s-210MB/s。
小數(shù)據(jù)塊(16KB)順序讀,吞吐量也有140MB/s,順序寫大概120MB/s-130MB/s。
無優(yōu)化sheepdog的吞吐量
在軟硬件不做任何優(yōu)化的情況下(不綁定雙網(wǎng)卡、不使用virtio、以默認參數(shù)啟動sheepdog),sheepdog的吞吐量數(shù)據(jù)比較低:
1、順序寫
- 數(shù)據(jù)塊大小為16KB,吞吐量13-14MB/s
- 數(shù)據(jù)塊大小在256KB-4MB之間,吞吐量30-35MB/s
2、順序讀
- 數(shù)據(jù)塊大小為16KB,吞吐量25MB/s左右,如果數(shù)據(jù)文件大小超過可用內(nèi)存,降低到20MB/s
- 數(shù)據(jù)塊大小在512KB-4MB之間,吞吐量125-140MB/s,如果數(shù)據(jù)文件大小超過可用內(nèi)存,降低到80MB/s以下
以下兩圖,上圖為數(shù)據(jù)文件512MB的測試數(shù)據(jù),下圖為數(shù)據(jù)文件4GB的測試數(shù)據(jù)
注,不使用virtio方式啟動sheepdog的命令行參數(shù)為:
qemu-system-x86_64 --enable-kvm -m 4096 -smp 4 -drive file=sheepdog:mint,index=0 \ -drive file=sheepdog:data,index=1 -vnc :1 -daemonize
吞吐量測試1:不使用對象緩存
從測試結果看,使用virtio方式啟動客戶機有利有弊:
1、提高了中小數(shù)據(jù)塊讀寫操作的吞吐量
- 當數(shù)據(jù)塊大小在16KB-512KB之間時,順序讀的吞吐量提高10MB/s-30MB/s不等
- 當數(shù)據(jù)塊大小在16KB-256KB之間時,順序寫的吞吐量提高5MB/s-8MB/s不等
2、大大降低了超大數(shù)據(jù)塊讀操作的吞吐量,至于為何virtio在這種情況下會降低測試的吞吐量,尚不清楚
- 當數(shù)據(jù)塊大小達到2MB或者4MB時,順序讀的吞吐量降低80MB/s-90MB/s
以下兩圖,上圖為512MB下的測試數(shù)據(jù),下圖為該情況下,與無優(yōu)化sheepdog讀寫512MB數(shù)據(jù)文件兩者吞吐量之差。
吞吐量測試2:使用對象緩存
使用了對象緩存,順序讀寫的吞吐量與數(shù)據(jù)文件大小沒有直接關系,即使數(shù)據(jù)文件大小超過可用內(nèi)存。
同時也使用了virtio,并沒有因此降低讀取大數(shù)據(jù)塊的吞吐量。
由于SSD硬盤的特點,數(shù)據(jù)塊越大,吞吐量越高,在數(shù)據(jù)塊大小為4MB的情況下,順序讀的吞吐量可達240MB/s,順序寫也有130MB/s;如果數(shù)據(jù)塊大小只有16KB,順序讀和順序寫的吞吐量分別只有55MB/s和35MB/s。
總結sheepdog性能
以上為sheepdog集群節(jié)點數(shù)為6個,且各節(jié)點都只掛載一塊SATA硬盤的情況下測得的結果,如果增加集群節(jié)點數(shù),并且每個節(jié)點都掛滿硬盤,IOPS應該會更高,而吞吐量取決于緩存和網(wǎng)絡帶寬,應該不會有明顯變化。