首页天道酬勤vsan 分布式存储(网络通信是通过什么实现的)

vsan 分布式存储(网络通信是通过什么实现的)

admin 12-03 17:32 354次浏览

作者|火巍子

编辑|卡罗尔

封面图| CSDN从视觉中国下载

随着各行各业数字化转型的深入,数据呈爆炸式增长。面对海量数据的存储需求,分布式存储在架构上显然有着天然的优势,但在这波数据洪流中也面临着性能上的新挑战。

由于分布式存储的工作原理是通过网络互联的方式将各个存储节点构建成一个集群,向外界提供更加可靠、高性能的服务,可以说分布式存储本质上是一种网络存储,其性能受网络影响很大。

在高性能分布式存储中,利用传统的TCP网络互连存储节点很容易形成网络瓶颈。在最容易被用户诟病的分布式存储IO延迟中,网络开销是不可忽视的一部分。

随着网络带宽的快速增长,软件的消耗成为网络性能的瓶颈,绕过CPU进行高性能传输的RDMA网络成为分布式存储的良好选择。

RDMA(Remote Direct Memory Access)可以简单理解为网卡完全绕过CPU,实现两台服务器之间的内存数据交换。作为一种硬件实现的网络传输技术,它可以大大提高网络传输效率,有助于网络IO密集型服务(如分布式存储、分布式数据库等)。)获得更低的延迟和更高的吞吐量。

最初的RDMA在IB(Infiniband)上实现。由于新硬件技术栈成本较高,主要用于HPC(高性能计算)等少数场景。随着新技术的发展,RDMA可以在以太网上使用。

目前RDMA以太网的传输协议是RoCEv2,这是一种基于无连接协议的UDP协议。与面向连接的TCP协议相比,UDP协议速度更快,占用CPU资源更少,但它不像TCP协议那样具有滑动窗口、确认等机制来实现可靠传输。一旦发生丢包,如果被上层应用检查重传,会大大降低RDMA的传输效率。

因此,为了充分发挥RDMA的真实性能,突破数据中心大规模分布式系统的网络性能瓶颈,有必要为RDMA构建一个无丢包的无损网络环境,而实现无丢包的关键是解决网络拥塞。解决拥塞问题的关键在于支持ECN等功能的交换机,一般交换机都支持这种技术。

既然RDMA是一个硬件技术解决方案,可以快速解决分布式存储中的网络延迟高等相关问题,那么直接更换这个新的硬件技术,一切都好吗?其实可能没那么简单,简单说一下RDMA科技在实践中踩过的坑。

00-

RDMA想说爱你却不容易

RDMA的使用需要应用程序的代码配合(RDMA编程)。

RDMA操作语义更接近硬件实现的语义形式,与传统的TCP/IP Socket编程有很大不同。不可能直接将RDMA接口应用于现有程序,使用原生的RDMA编程库比Socket编程复杂得多。

而RDMA编程在编程模式下是异步的,而原来的Socket编程是同步的。这将使大多数开发人员难以将原始应用程序适应RDMA或编写全新的RDMA本地应用程序。

那么,如果RDMA对接完成,我们的程序能达到高性能吗?让我们来看看RDMA在通信模块中的比较性能测试。

RDMA用于RPC模块

RPC框架通常用于分布式存储中节点之间的通信,RPC性能对整体存储性能有重要影响。作者实现了一个基于C的RPC框架,可以灵活支持多种数据传输协议和协同学的快速处理,适用于对性能要求较高的场景。RPC框架支持传统的TCP和RDMA传输模式。RDMA模式下,RDMA内存注册统一管理,数据传输采用双边操作,支持事件和轮询的请求检测机制。团队对两种传输方式的性能进行了对比测试,测试结果如下图所示:

图1 RPC TCP与RDMA性能对比测试

(测试说明:使用相同的10Gb网卡,使用不同的模式进行对比测试)

通过测试,我们发现RDMA具有明显的优势,尤其是在低深度场景下,可以获得更好的性能。我们继续用实际业务测试RPC对接。在这里,我们对接了一个基于RAFT一致性协议的多副本数据存储业务。测试结果如下图所示:

图2对接实际业务后的性能对比测试

从以上测试结果可以看出,在涉及实际业务的测试中,RDMA的表现不如原RDMA测试。我们分析主要原因是线程切换、数据复制等操作以及IO路径上的其他模块引入了额外的开销。

那么如何才能充分发挥RDMA的出色表现呢?在练习的过程中,我们也带着针。

对分布式存储系统Ceph分别使用TCP和RDMA进行了对比测试,测试结果也不是十分满意,我们发现在Ceph中对于激动的奇迹的场景使用不同的传输模式都没有明显的提升,甚至还有略微的下降,对于大IO的高吞吐情况,还会出现性能的明显下降,测试结果见下图:

图3 Ceph 原生RDMA 1M大块吞吐测试结果

在测试结果的基础上我们分析了Ceph中关于RDMA部分的实现,主要发现存在下面几个问题:

Ceph中使用双边的编程方式,传输的过程并没有绕开CPU,同时Ceph内部使用bufferlist的数据结构,需要多次进行内存拷贝,没有充分发挥RDMA中零拷贝的特性。

由于RDMA的异步编程模型,需要进行Polling来检测数据操作的完成,使用单独的线程轮询不但没有降低CPU,反而有更多的CPU开销,而如果使用事件机制则会增加延迟降低性能。

RDMA在上述的各个场景中,都没能充分发挥其优越性能,那么需要怎样的编程方式才能发挥其价值呢?笔者团队又探索了SPDK(Storage performance development kit)的NVMe-oF中的RMDA使用方式。

RDMA在NVMe-oF中的使用

NVMe Over Fabrics(NVMe-oF)是使用RDMA或光纤通道(FC)架构等Fabric技术取代PCIe传输,从而将把本地高速访问的优势暴露给远端应用的一种传输技术。在SPDK中实现了相关的逻辑,下图是分别通过SPDK的NVMe-oF的target访问与本地访问SSD的性能对比测试。

图4 NVMe-oF 与原始SSD的性能对比测试

通过上面的数据我们发现,通过RDMA的网络传输的性能和原始的性能非常接近,在单深度的情况下读延时只增加了11us,写延时只增加了 18 us。通过多深度能够跑出与本地SSD相当的性能。上面的测试也进一步论证了正确地使用RDMA的相关编程技术是能够充分发挥出硬件优越性能的。

我们分析了SPDK中关于RDMA相关的实现,认为以下因素是RDMA编程实现的关键:

充分利用RDMA的内存注册机制,整个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数据包大小和处理时间。

SRPC的架构如图6所示,一个服务端server进程绑定一个port监听连接,server可以设置多个线程作为多个poll group并行处理请求,从请求接收到处理和回调Reply的整个过程都在同一线程内完成;客户端client创建channel连接server,可以指定要连接的server线程,client可以设置多线程,并在创建channel时分配其所在的线程。SRPC同时也支持使用TCP协议兼容未配置专用RDMA网卡的场景。

图6 SRPC通信架构

(2)数据传输方式

在使用RDMA操作数据传输时,通常有使用双边操作传输和使用单双边操作结合传输两种方式,SRPC选择了更为灵活的单双边操作结合的方式。

如图7所示,使用双边操作(SEND/RECV)传输数据与传统Socket网络传输类似,发送端使用RDMA SEND发送数据,接收端使用RDMA RECV接收数据。但是在发送端发起RDMA SEND操作之前,接收端需要准备好接收数据的内存区并发起RDMA RECV操作,否则就会发送失败。因此双方需要约定一次传输最大的数据大小,一般在在创建RDMA连接时协商,接收端以该大小准备接收内存区,发送端以该大小对大请求进行切分。使用双边RDMA SEND/RECV的限制在于当请求小于约定大小时存在接收端内存浪费的现象,而请求大于约定大小时需要发送端切分多次传输并在接收端重组,并且通常需要应用Buffer到RDMA协议Buffer之间的内存拷贝,增加了开销和延迟。

图7 RDMA双边传输方式

如图8所示,在单双边结合的传输方式下,双边SEND/RECV多用于控制类消息传输,而实际数据则是通过单边READ/WRITE来完成。在实际场景中每次需要传输的数据大小不是固定的,所以发起单边操作前需要先协商好数据长度和相应的内存区信息。其方式为先使用双边SEND/RECV操作把待传输数据的内存地址、大小、rkey等控制信息进行传输,然后根据传输类型选择单边READ或WRITE操作完成实际数据的传输,最后使用双边SEND/RECV操作发送Reply结果。

数据发送到对端在实际场景中每次需要传输的数据大小不是固定的,所以发起单边操作前需要先协商好数据长度和相应的内存区信息。单双边结合传输的方式具有灵活适应各种大小请求的特点,尤其在传输大请求时具有明显优势,只需要一次单边操作即可将数据全部传输,同时单双边结合的方式也实现了应用Buffer到RDMA协议Buffer之间的数据零拷贝,进一步降低了开销和延迟。

图8 RDMA单双边结合传输方式

SRPC设置了两种模式进行请求的检测和处理,分别是性能模式和经济模式。性能模式下SRPC不间断轮询RDMA CQ队列获取请求,可以更快地响应请求并进行处理。而经济模式下SRPC采用RDMA事件触发与低频率轮询相结合的方式来进行请求检测处理,可以降低对CPU等资源的消耗。

SRPC根据负载采用智能算法自动在两种模式之间切换,当请求密集时采用性能模式快速处理请求,降低延迟,而当负载较低时则转入经济模式,降低CPU等资源使用,降低能耗。

总结

RDMA的编程模式与传统TCP/IP相比有很大的不同,不管是内存使用机制,还是数据操作逻辑都发生了很大的变化。使用RDMA可以减少在内核协议栈处理和内存拷贝等开销,从而大幅降低数据在网络上传输的延迟,但实际数据访问需要经过软件栈多个模块的处理,这其中可能存在数据拷贝和同步等开销,当存储设备的访问延迟和网络传输延迟都达到10us级别时,这些软件栈上的开销对整体性能的影响变得愈发明显。

从TCP/IP网络通信切换到RDMA通信不仅仅是数据收发网络接口的简单替换,而是需要进行整体的软件架构的优化设计,使IO路径上各模块契合RDMA的特点整体联动,才能充分发挥RDMA的优势,并与NVMe SSD等高性能低延迟设备结合,取得存储性能的突破。

【作者介绍】

火尉子,华中科技大学博士,研究分布式存储、大数据存储中的数据分布、性能和可靠性,在国际会议和期刊上发表多篇相关论文,目前主要从事分布式存储系统性能提升、网络通信优化的研发工作,专注于存储性能优化、RDMA等领域,2018年加入深信服科技。

Python常用图像形态学操作实例分析#yyds干货盘点#消息队列(如 Kafka 等)的应用场景深入解析设计模式中的装饰器模式在iOS应用开发中的实现Linux(centos7)下的文件操作nginx七层负载均衡配置详解PHPcurl实现抓取302跳转后页面的示例
雷蛇鼠标没反应(雷蛇鼠标连点) 状态机三段式(pcie和sata的区别)
相关内容