浅谈分布式存储中的网络通信( 三 )


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等高性能低延迟设备结合,取得存储性能的突破 。


推荐阅读