随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈。在云计算这样的技术领域,专利储备往往代表着企业***的技术实力。华云数据本期“智汇华云”专栏将解析Kernel bypass技术及其在Ceph中的应用介绍,与大家共同分享云计算领域的***技术与解决方案。
背景
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 bypass(绕过内核)是解决系统网络栈和存储栈性能瓶颈的另外一种方式,与传统的中断机制不同,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中的应用,后续将对上述各部分进行深度的分析,敬请期待。