浅谈分布式存储中的网络通信CSDN

作者

火尉子责编

Carol封图

CSDN下载自视觉中国在各行各业数字化转型深入的当下,数据呈爆炸式增长。面对海量数据的存储需求,分布式存储显然在架构上有着天然优势,但在这波数据洪流之中也面临着性能上的全新挑战。由于分布式存储的工作原理是将各个存储节点使用网络互联的方式构建为集群,向外部提供更加可靠的高性能服务,因此可以说分布式存储本质上是一种网络存储,其性能在很大程度上受网络的影响。在高性能的分布式存储中,使用传统的TCP网络进行各存储节点之间的网络互联很容易形成网络瓶颈,而在分布式存储最容易让用户诟病的IO延时方面,网络部分的开销是不可忽视的一部分。随着网络带宽的高速增长,在软件上的消耗已成为网络性能的瓶颈,而通过绕过CPU实现高性能传输的RDMA网络成为分布式存储不错的选择。RDMA(RemoteDirectMemoryAccess),可以简单理解为网卡完全绕过CPU实现两个服务器之间的内存数据交换。其作为一种硬件实现的网络传输技术,可以大幅提升网络传输效率,帮助网络IO密集的业务(比如分布式存储、分布式数据库等)获得更低的时延以及更高的吞吐。最初的RDMA是实现在IB(Infiniband)上,由于其新的硬件技术栈成本比较高,主要用于HPC(高性能计算)等少数场景。而新的技术发展下,能够实现在以太网上使用RDMA。当前RDMA在以太网上的传输协议是RoCEv2,RoCEv2是基于无连接协议的UDP协议,相比面向连接的TCP协议,UDP协议更加快速、占用CPU资源更少,但其不像TCP协议那样有滑动窗口、确认应答等机制来实现可靠传输,一旦出现丢包,依靠上层应用检查到了再做重传,会大大降低RDMA的传输效率。所以要想发挥出RDMA真正的性能,突破数据中心大规模分布式系统的网络性能瓶颈,势必要为RDMA搭建一套不丢包的无损网络环境,而实现不丢包的关键就是解决网络拥塞。在解决拥塞问题的关键在支持ECN等特性的交换机,而这个技术在一般的交换机都普遍支持。既然RDMA是一个硬件技术方案,而且在分布式存储中又能快速地解决网络高延时等相关问题,是不是直接更换上这个新的硬件技术就能万事大吉?实际可能并没有那么简单,那么我们就来简单聊聊RDMA技术实践过程中踩过的坑。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内存,并采用双边操作进行数据传输,支持事件和轮询的请求检测机制。笔者团队对两种传输方式的性能进行了对比测试,测试结果参见下图:图1RPCTCP与RDMA性能对比测试(测试说明:使用同一张10Gb网卡,采用不同的模式进行对比测试)通过测试我们发现RDMA的方式具有明显的优势,尤其在低深度的场景下能获得更好的性能。我们继续将RPC对接实际业务进行了测试,在这里我们对接了一个基于RAFT一致性协议的多副本数据存储业务,测试结果参见下图:图2对接实际业务后的性能对比测试从上面的测试结果看到,在包含有实际业务的测试中,RDMA的表现并没有原始的RDMA测试表现那么优异,我们分析了其主要原因是线程切换、数据复制等操作以及IO路径上其它模块引入了额外的开销。那么怎样才能发挥出RDMA的优异性能?在实践过程中我们也针对分布式存储系统Ceph分别使用TCP和RDMA进行了对比测试,测试结果也不是十分满意,我们发现在Ceph中对于小IO的场景使用不同的传输模式都没有明显的提升,甚至还有略微的下降,对于大IO的高吞吐情况,还会出现性能的明显下降,测试结果见下图:图3Ceph原生RDMA1M大块吞吐测试结果在测试结果的基础上我们分析了Ceph中关于RDMA部分的实现,主要发现存在下面几个问题:Ceph中使用双边的编程方式,传输的过程并没有绕开CPU,同时Ceph内部使用bufferlist的数据结构,需要多次进行内存拷贝,没有充分发挥RDMA中零拷贝的特性。由于RDMA的异步编程模型,需要进行Polling来检测数据操作的完成,使用单独的线程轮询不但没有降低CPU,反而有更多的CPU开销,而如果使用事件机制则会增加延迟降低性能。RDMA在上述的各个场景中,都没能充分发挥其优越性能,那么需要怎样的编程方式才能发挥其价值呢?笔者团队又探索了SPDK(Storageperformancedevelopmentkit)的NVMe-oF中的RMDA使用方式。RDMA在NVMe-oF中的使用NVMeOverFabrics(NVMe-oF)是使用RDMA或光纤通道(FC)架构等Fabric技术取代PCIe传输,从而将把本地高速访问的优势暴露给远端应用的一种传输技术。在SPDK中实现了相关的逻辑,下图是分别通过SPDK的NVMe-oF的target访问与本地访问SSD的性能对比测试。图4NVMe-oF与原始SSD的性能对比测试通过上面的数据我们发现,通过RDMA的网络传输的性能和原始的性能非常接近,在单深度的情况下读延时只增加了11us,写延时只增加了18us。通过多深度能够跑出与本地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网络和NVMeSSD设计了低延迟高并发的存储架构,将存储节点前后端网络使用RDMARoCE接入,实现低延迟极速网络传输,并对IO栈上各模块进行了相应的优化设计。深信服EDS存储架构采用了runto


转载请注明:http://www.aierlanlan.com/cyrz/7933.html