那么怎样才能发挥出RDMA的优异性能?在实践过程中我们也针对分布式存储系统Ceph分别使用TCP和RDMA进行了对比测试,测试结果也不是十分满意,我们发现在Ceph中对于小IO的场景使用不同的传输模式都没有明显的提升,甚至还有略微的下降,对于大IO的高吞吐情况,还会出现性能的明显下降,测试结果见下图:
文章插图
图3 Ceph 原生RDMA 1M大块吞吐测试结果
在测试结果的基础上我们分析了Ceph中关于RDMA部分的实现,主要发现存在下面几个问题:
- Ceph中使用双边的编程方式,传输的过程并没有绕开CPU,同时Ceph内部使用bufferlist的数据结构,需要多次进行内存拷贝,没有充分发挥RDMA中零拷贝的特性 。
- 由于RDMA的异步编程模型,需要进行Polling来检测数据操作的完成,使用单独的线程轮询不但没有降低CPU,反而有更多的CPU开销,而如果使用事件机制则会增加延迟降低性能 。
- RDMA在NVMe-oF中的使用
文章插图
图4 NVMe-oF 与原始SSD的性能对比测试
通过上面的数据我们发现,通过RDMA的网络传输的性能和原始的性能非常接近,在单深度的情况下读延时只增加了11us,写延时只增加了 18 us 。通过多深度能够跑出与本地SSD相当的性能 。上面的测试也进一步论证了正确地使用RDMA的相关编程技术是能够充分发挥出硬件优越性能的 。
我们分析了SPDK中关于RDMA相关的实现,认为以下因素是RDMA编程实现的关键:
- 充分利用RDMA的内存注册机制,整个IO路径过程中使用内存池中的内存,实现全流程零拷贝 。
- 对于控制消息(小IO)使用send/recv的双边编程方式,对于数据消息(大IO)使用write/read的单边编程方式 。
- RDMA的poll与NVMe盘的读写处于同一个线程,整个过程没有线程切换,是全用户态的IO处理 。
文章插图
EDS中的RDMA应用基于以上对于分布式存储中RDMA使用的分析,笔者团队认为简单地生搬硬套发挥不了RDMA与新型存储设备的性能优势,从整体框架上进行RDMA适配,将IO路径上各模块联动优化才是分布式存储追求极致性能之路 。为此我们设计验证了面向RDMA的高性能分布式存储框架和实现方案,并在深信服企业级分布式存储EDS中落地应用 。
EDS针对RDMA网络和NVMe SSD设计了低延迟高并发的存储架构,将存储节点前后端网络使用RDMA RoCE接入,实现低延迟极速网络传输,并对IO栈上各模块进行了相应的优化设计 。深信服EDS存储架构采用了run to complete和无锁化编程模型,并优化了各模块之间的数据处理,实现系统内全IO栈的内存零拷贝,使整体性能得到了极大的提升 。
如图5所示,前端协议网关(Protocol Gateway,PGW)接收来自用户的多种协议类型请求(包括NFS,SAMBA,S3,Swift,iSCSI,NVMe-OF等),将这些请求封装后通过SRPC通信模块发送到存储服务端进行处理 。存储服务端解析请求后由存储引擎进行相应的处理并访问存储设备完成数据的写入和读取 。
前端PGW请求发送和回调、存储服务端请求处理采用run to complete的方式在同一线程完成,极大地提高单个请求的处理速度,并采用无锁化编程的方式启用多个线程分组处理请求,达到请求的高并发 。此外设计了统一的数据缓存管理机制,整个请求处理过程从数据经RDMA接收后,经过各模块处理,再到通过RDMA发送出去,全程不需要对数据进行内存拷贝,进一步减少系统开销并大幅降低了延迟 。
文章插图
图5 EDS存储软件架构示意图
文章插图
SRPC通信模块设计
(1)通信架构深信服EDS存储设计了面向存储系统消息传输的专用网络通信模块SRPC,将上层多种类型请求消息封装,使用RDMA进行快速数据传输,可以灵活扩展支持上层NVMe-OF、iSCSI等多种类型协议,并对消息封装进行了抽象和简化,减少RPC数据包大小和处理时间 。
推荐阅读
- 茶叶买回家该怎么存储,储存白毛猴茶的常见方法
- 常见分布式锁实现方式
- eBay PB 级日志系统的存储方案实践
- 浅谈汇编器、编译器和解释器
- 聊一聊SQL Server中存储过程和函数的区别
- 存储中普洱茶的变化,普洱茶的燥感之迷
- 科学家成功操纵“暗态”量子态,量子位存储时间提升500倍
- 玳玳花茶相关知识,玳玳花茶存储方式
- 分布式数据库调优实践
- 玳玳花茶存储方式,玳玳花茶冲泡方法