背景
Ceph是當前最流行的開源分布式統一存儲,在一套基礎架構中同時支持塊存儲、對象存儲和文件存儲,支持PB級別的擴展能力,廣泛用于云環境中;Ceph來源于Sage Weil博士一項關于存儲系統的PhD研究項目,最初被設計為一個分布式文件系統,整體架構基于低速設備而構建,提供毫秒(ms)級別的IO延遲。
從1956年第一塊機械硬盤(HDD)誕生至今,存儲介質的容量和性能都取得了長足的發展,特別是2011前后固態硬盤(SSD)產生后,IOPS出現了指數級的增長,IO延遲也從毫秒(ms)降到了微妙(us),提升了1000倍以上;與此同時,網絡傳輸速率也從10年前的100Mbps,發展到了目前的100Gbps,實現了1000倍的增長。
隨著硬件性能的快速提升,傳統的軟件實現和架構已成為提升軟件系統的主要瓶頸,有數據表明,在全NVMe固態介質的配置下,Ceph集群性能只有硬件限性性能的40%左右,所以為了充分利用高性能介質,需要對現有的軟件進行重構。
Kernel bypass技術
隨著硬件性能的提升,內核中的網絡棧和存儲棧帶來的性能瓶頸越來越明顯,為縮短io路徑、解決NVMe SSD在傳統IO棧上的性能問題,Linux內核從4.x開始引入了新的NVMe IO棧,如下圖,可以看新的IO子系統完全擯棄了傳統的通用塊層和SCSI子系統:
而kernel bypas(繞過內核)是解決系統網絡棧和存儲棧性能瓶頸的另外一種方式,與傳統的中斷機制不同,kernel bypass的核心思想是:內核只用來處理控制流,所有數據流相關操作都在用戶態進行處理,從而規避內核的包拷貝、線程調度、系統調用、中斷等性能瓶頸,并輔以各種性能調優手段(如:CPU pin、無鎖隊列),從而達到更高的性能。目前市場上也有多種類似的技術,如DPDK、NETMAP、SPDK、PF_RING、RDMA等,其中 DPDK 因為更徹底的脫離內核調度以及活躍的社區支持從而得到了更廣泛的使用。下文簡單介紹下DPDK、SPDK以及RDMA的技術原理:
DPDK(Data Plane Development Kit)是由Intel發起,主要基于Linux系統運行,用于快速數據包處理的函數庫與驅動集合,可以極大提高數據處理性能和吞吐量,提高數據平面應用程序的工作效率。DPDK使用了輪詢(polling)而不是中斷來處理數據包。在收到數據包時,經DPDK重載的網卡驅動不會通過中斷通知CPU,而是直接將數據包存入內存,交付應用層軟件通過DPDK提供的接口來直接處理,這樣節省了大量的CPU中斷時間和內存拷貝時間。
SPDK(Storage Performance Development Kit)是由Intel發起,用于加速使用NVMe SSD作為后端存儲的應用軟件加速庫,該軟件庫的核心是用戶態、異步、輪詢方式的NVMe驅動。與內核態的NVMe驅動相比,它可以大幅度降低延遲,同時提升單CPU核的IOPS。其架構如下:
RDMA(Remote Direct Memory Access)全稱遠程直接數據存取,就是為了解決網絡傳輸中服務器端數據處理的延遲而產生的。RDMA通過網絡把資料直接傳入計算機的存儲區,將數據從一個系統快速移動到遠程系統存儲器中,而不對操作系統造成任何影響,這樣就不需要用到多少計算機的處理功能。它消除了外部存儲器復制和上下文切換的開銷,因而能解放內存帶寬和CPU周期用于改進應用系統性能。下圖直觀的展示了傳統模式和RDMA模式下的差異:
SPDK技術在Ceph BlueStore中的應用
先來看一組來自Intel的性能測試數據:用戶態NVMe 驅動 VS 內核態NVMe驅動
通過上面的對比數據,我們看到了SPDK的優異性能表現及潛力,很自然想到可以通過加速Ceph OSD后端IO來提升Ceph性能,具體做法是:使用SPDK中的用戶態NVMe驅動替代內核驅動,bluestore架構如下:
從上圖可得到如下信息:
1.使用裸設備,數據直接寫入塊設備,消除文件系統的影響
2.在裸設備上構建輕量級的Bluefs文件系統,用于承載元數據庫RocksDB
3.支持插件式的塊分配器(當前支持StupidAllocator和BitmapAllocator兩種)
4. 支持插件式的塊設備驅動(當前僅支持Kernel Driver)
所以,要支持新的塊設備驅動只需添加新的設備類型(Type)以及實現相應的驅動(Driver)即可。
DPDK/RDMA技術在Ceph中的應用
在講DPDK/RDMA的應用前,我們先來看看Ceph中兩種常用的網絡模塊(Messenger):
1.SimpleMessenger
SimpleMessenger是Ceph最早支持的一種網絡模塊,如其名字所述,實現相對比較簡單:它通過一個線程來監聽服務端口、接收客戶連接;每個新建連接與一個Pipe關聯,實現兩個端口間類似管道的功能;Pipe內部分別有一個讀寫線程用來處理這個Pipe有關的消息接收和請求的發送;SimpleMessenger通過共享隊列向各連接分發接收到的消息。由于每個連接都需要關聯一對讀寫線程來負責消息和請求的處理,很顯然,隨著連接數量以及并發的增大,將會產生大量的線程,隨之線程上下文切換、TCP/IP的overhead也將成倍的增加,嚴重影響消息和請求的處理性能。
2.AsyncMessenger
為了解決SimpleMessenger中大量線程上下文切換帶來的overhead,AsyncMessenger采用了IO多路復用技術(如:epoll、kqueue)以及線程池,來處理消息接收和請求發送,這樣可以非阻塞的處理多個網絡請求;為了兼容不同的傳輸協議棧,AsyncMessenger還通過插件的方式支持多種傳輸協議,如:posix、dpdk和rdma,其結構如下:
從上圖我們可以看到通過繼承NetworkStack,添加不同的實現即可支持不同的傳輸協議,如:PosixStack、DPDKStack、RDMAStack。
結合上述的DPDK技術、RDMA技術和SPDK技術,Ceph將能夠提供一套純用戶態的存儲解決方案,個人認為也是當前存儲系統設計的其中一個發展方向。
上文簡單介紹了DPDK、SPDK、RDMA技術在Ceph中的應用,后續將對上述各部分進行深度的分析,敬請期待。