- 《架構師》2018年7月
- InfoQ中文站
- 3248字
- 2019-01-09 14:05:41
如何“計算”CEPH讀寫性能

Ceph作為SDS的杰出代表,借著云計算的東風,可謂是紅遍大江南北,老少皆知(這個有點扯,回家問問你爺爺聽過ceph沒)。不管是SDS也好,還是SDN也好,所謂SDX系列均是以高度靈活性著稱,這就給玩家一個廣闊的想象空間。所有的部件均是靈活自主可控的,你可以自己隨意組裝,就像自己裝電腦一樣。
那么問題來了,這樣搭建出來的集群到底能達到什么水平呢?讀寫性能有多高?不要告訴我搭建出來測試一下不就知道了,如果測試結果不滿足業務需求呢,再建一套?那客戶還留你何用!
進化三部曲
1.最近一直在思考一個存儲集群的讀寫性能到底能達到什么水平?
2.跟構成集群所用單塊磁盤到底是怎樣的關系?
3.能不能通過計算得出集群的性能指標?
路人甲的思考
在了解ceph的原理之前,大腦中有這樣一個概念:既然集群是有很多塊磁盤構成的,那么集群的性能應該就是所有磁盤的性能之和,假如一個集群100塊磁盤構成,那么集群的整體性能應該就是這100塊磁盤之和。例如單塊磁盤的IO有500,那么集群的IO應該就是500*100=50K。想到這里,心里還挺滿意的,這意味著使用ceph集群不但能夠獲得大容量,而且性能也是成倍的增加!
與君初見
慢慢了解到一些ceph的基礎知識以后發現,好像現實并不是想象中的那么美好,特別是看了一遍陳導總結的《Ceph讀寫性能估算方法》之后,發現原來這里面還有很多值得思考的點,例如:三副本(一份文件存三份,只有1/3的空間利用率)、waf(寫放大,二次寫journal導致寫IO減半)、還有各種元數據、DB、wal占用集群空間。這樣算下來,我組裝的集群可用容量減到三分之一,磁盤IO減半,最后集群的性能還不如單塊磁盤的性能高。難道ceph是江湖騙子拿來忽悠的?
無形勝有形
聽君一席話,勝讀十年文檔,經過高人點撥之后茅塞頓開。從容量上來說,ceph可以靈活配置副本數量,合理規劃空間使用。如果你覺得默認的三副本策略太浪費磁盤,也可以配置兩副本數來實現50%的磁盤空間使用率,或者單副本(不過我還是勸你等到頭腦清醒的時候再做決定)實現100%。
除了副本策略外,ceph還支持糾刪碼策略,通過靈活配置K+M比例,合理規劃磁盤冗余度,來實現整個集群的高可靠性,例如,按照K=3, M=2配置糾刪碼冗余策略,當有一組數據寫入時,該數據會被分成3份分別寫入3個OSD中,同時ceph也會生成2個編碼塊寫入到另外2個OSD中,一次寫入操作,實際上會產生(K+M)/K倍的實際寫入量,在保證集群高可靠性的同時大大提高磁盤使用率。
從讀寫性能上來說,并不是上文所說的創建集群之后由于寫放大的緣故,導致整個集群的性能下降為單塊磁盤的50%。大家都知道ceph是一種分布式的存儲系統,同時也是一種對象存儲。當然這里所說的對象并不是指對用戶提供對象存儲的功能,這里的對象是ceph或者說rados在內部處理數據的方式。通過外部接口(對象存儲接口RGW、塊存儲接口RBD、文件系統存儲cephFS、當然還有我們自研的HDFS接口、流媒體接口等)寫入的數據分片,生成許多小的對象,然后再把這些小的對象均勻的寫入到各個物理磁盤上面。
了解過ceph的人應該都聽過PG的概念,這些內部的小對象就是通過PG這個模塊來進行分組,屬于同一組的內部小對象會有相同的物理磁盤位置。例如第一組小對象的三個副本會寫入到osd1、2、3上面,第二組小對象寫入到osd2、3、4上面。如果集群內部的PG數量足夠多,用戶數據就會均勻的分布到各個物理磁盤上面,這樣同一時刻用戶存入的數據就會同時在不同的物理磁盤上面進行寫入。雖然集群寫入速度不是所有磁盤之和,但也是多塊磁盤性能累加的,最后用戶感知到的性能也是可觀的。
預測“未來”
了解了大概原理以后,如何根據用戶提供的硬件資源來預估集群的性能呢?
計算公式
FileStore + 多副本
條件假設一:
1.假設每塊磁盤作為一個OSD,這個OSD的journal和data都放在這塊磁盤上。所有數據都是先寫到journal上,然后再寫到data上,也就是單OSD的寫放大系數是2;
2.假設OSD個數為N;
3.假設副本數是M,數據直到寫入M個OSD之后才響應,因此對于多副本存儲池,寫放大系數是M;
4.因為Ceph軟件會損耗CPU資源,也會損耗一些性能,損耗系數定為0.7;
5.假設單塊SSD的4K隨機讀IOPS是R,4K隨機寫IOPS是W。
在不考慮網絡瓶頸和CPU瓶頸的情況下,Ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7/(2*M)
條件假設二:
1.假設每塊SATA磁盤作為一個OSD,有一塊NVME磁盤專門作為journal。所有數據都是先寫到journal上,然后再同步到data上,也就是單OSD的寫放大系數就變成1(假設NVME性能大于所有本機SATA盤之和);
2.假設OSD個數為N;
3.假設副本數是M,數據直到寫入M個OSD之后才響應,因此對于多副本存儲池,寫放大系數是M;
4.因為ceph軟件會損耗CPU資源,也會損耗一些性能,損耗系數定為0.7;
5.假設單塊SSD的4K隨機讀IOPS是R,4K隨機寫IOPS是W。
在不考慮網絡瓶頸和CPU瓶頸的情況下,Ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7/(M)
BlueStore + 多副本
條件假設一:
1.假設每塊磁盤作為一個OSD,該磁盤劃為2塊分區:一個分區作為裸盤來寫入數據,另一塊做BlueFS用來跑RocksDB。因此我們一次寫入的流程可以簡化成下圖:數據會被直接寫入到data分區(裸盤)中,而對象元數據會被寫到RocksDB和RocksDB的WAL中,隨后RocksDB將數據壓縮后存放到磁盤中。我們不再需要在文件系統層做journal,而WAL只在覆寫操作時才會用到,因此在副本數量為N的條件下,我們可以推測WAF將收斂于N,也就是單OSD的寫放大系數是1。
2.假設OSD個數為N;
3.假設副本數是M,數據直到寫入M個OSD之后才響應,因此對于多副本存儲池,寫放大系數是M;
4.由于ceph軟件會損耗CPU資源,也會損耗一些性能,損耗系數定為0.7;
5.假設單塊SSD的4K隨機讀IOPS是R,4K隨機寫IOPS是W。
在不考慮網絡瓶頸和CPU瓶頸的情況下,ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7/(M)
注意:在BlueStore中,磁盤分區會以‘bluestore_min_alloc_size’的大小分配管理,這個數值默認為64KiB。也就是說,如果我們寫入<64KiB的數據,剩余的空間會被0填充,也即是‘Zero-filled data’,然后寫入磁盤。也正是這樣,BlueStore的小文件隨機寫性能并不好,因此在小文件計算式可以適量減少損耗系數。
條件假設二:
1.假設每塊SATA磁盤作為一個OSD,有一塊NVME磁盤專門作跑RocksDB。數據會被直接寫入到data分區(裸盤)中,而對象元數據會被寫到RocksDB和RocksDB的WAL中,也就是單OSD的寫放大系數就變成1;
2.假設OSD個數為N;
3.假設副本數是M,數據直到寫入M個OSD之后才響應,因此對于多副本存儲池,寫放大系數是M;
4.因為ceph軟件會損耗CPU資源,也會損耗一些性能,損耗系數定為0.7;
5.假設單塊SSD的4K隨機讀IOPS是R,4K隨機寫IOPS是W。
在不考慮網絡瓶頸和CPU瓶頸的情況下,ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7/(M)
FileStore + 糾刪碼
相比較多副本冗余策略,糾刪碼的出現大大節省了磁盤空間,如果我們有N個OSD,并且按照K=3, M=2配置糾刪碼冗余策略。一次寫入操作,實際上會產生(K+M)/K倍的實際寫入量。而由于這里使用的存儲后端是FileStore, journaling of journal問題會讓寫放大兩倍,因此結合糾刪碼本身特性,WAF最終會收斂于(K+M)/K*2。
在不考慮網絡瓶頸和CPU瓶頸的情況下,Ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7*2*K/(K+M)
BlueStore + 糾刪碼
有了前文的鋪墊后,相信到這一步大家能夠自己推演出BlueStore在糾刪碼策略下的寫入性能推導公式。由于解決了journaling of journal問題,每次寫入不再需要通過文件系統,因此WAF最終將會收斂于(K+M)/M。
在不考慮網絡瓶頸和CPU瓶頸的情況下,Ceph存儲池的IOPS估算公式是:
1.4K隨機讀IOPS = R*N*0.7
2.4K隨機寫IOPS = W*N*0.7K/(K+M)
目標是星辰大海
通過上述計算得出的結果就可以直接用來作為參考了么?答案當然是否定的。
以上的計算我們僅僅是考慮了磁盤這一單一變量,除此之外還有網絡、cpu資源等都需要列入計算。
ceph是一個分布式的系統,任何一個短板都會影響集群的對外輸出性能。
例如網絡資源:假設單節點有10塊SATA磁盤,每塊的讀帶寬是100MB/s,按照上面的公式,單節點的讀帶寬大概是100*10*8=8G/s。假設此時機器上面只有兩個千兆端口,即使是做了RR捆綁,也只能提供2G/s,帶寬,此時集群的性能參考可能就是網絡端口的極限值了。
再例如CPU資源:按照經驗值單核處理的寫IO大概是2000左右,假設一臺機器配置了20塊50K IOPS的SSD,此時的性能極限就很有可能被CPU限制了。
總之,如何在紛繁的選擇中,描繪出最美“畫面”,是一件很“藝術”的事情。