◆金 浩 梅君君
一种RDMA传输控制方法研究
◆金 浩 梅君君
(南京中兴新软件有限责任公司 江苏 210012)
面对高性能计算、分布式存储等应用的快速发展,新兴的RDMA技术解决了传统网络架构的性能瓶颈,但RDMA传输过程中需要不断交互实现内存状态同步,本文提出一种滑动窗口传输控制方法,有效减少收发双方交互次数,降低RDMA单边操作的成本。
RDMA;内存池;滑动窗口
RDMA(Remote-Direct Memory Access)远程内存直接访问是Mellanox、Intel等公司推出的高速网络技术,与传统网络技术相比,RDMA能够绕过操作系统协议栈、减少内存拷贝次数、避免系统态内核态切换开销,从而提供更高带宽、更低时延、占用更少的系统资源。
RDMA是一种直接访问远端计算机存储区的网络传输技术,将数据从本地系统快速拷贝到远程系统存储器中,传输过程中只占用单边CPU资源,同时绕过操作系统内核协议栈,能够显著提高数据传输性能。RDMA技术已经应用到各类业务场景,尤其是对带宽、时延要求非常高的分布式存储系统,采用RDMA网络传输大量文件数据,绕过传统网络的性能瓶颈,充分发挥出NVMe SSD、PM等新型硬件的性能。
单边操作是实现RDMA协议性能优势的关键,单边操作需要两个条件:首先得到目标地址,其次确认目标内存状态可用。RDMA远程读内存前提是远端内存更新完成,RDMA远程写内存前提是目标内存可覆盖。
单边操作必须增加内存状态同步的开销,每次重新注册内存的方式成本太高,目前RDMA数据传输多采用复用内存池的方法,以远程写操作为例,执行流程如下:
(1)客户端,根据IP地址与服务端链接,服务端通过多段内存组成内存池。
(2)客户端,根据业务需求向服务端发起内存分配请求。
(3)服务端,从内存池中分配一个内存块,应答消息包含地址、主键信息。
(4)客户端,执行write-with-imm指令,向服务端内存写入数据。
(5)服务端,根据业务需要处理内存中数据,内存恢复可用状态。
(6)客户端重新执行步骤2。
客户端每次写数据前,必须向服务端口申请空闲内存,理论上只需要单边CPU参与的WRITE指令降级为两边CPU都参与的多次交互,这与RDMA协议初衷相悖。
单边读写实现的直接访问远端内存能力是RDMA协议的核心,可以看作将主机内存总线延伸到网络节点,现有的RDMA数据传输过程需要频繁交换内存状态,才能避免内存覆盖或读取非法数据。
针对该问题,本文设计了一种基于滑动窗口的传输确认机制。客户端节点初始化滑动窗口,窗囗大小为内存块数量M,滑动窗口有足够的空闲空间时,客户端向服务端写入x单位内存数据,则滑动窗囗缩减x单位,客户端收到确认报文y后,滑动窗口扩展y单位。客户端与服务端节点通过长度为M的滑动窗囗控制数据发送流程,只要发送窗囗可用,客户端可以立即向远端写数据,不需要频繁地从服务端口申请内存。RDMA传输过程出现丢包时,需要从头重传报文,开销巨大,本方案中客户端每次写入长度较小,丢包重传的成本固定可预测,服务端的应答报文支持批量确认,大大减少ACK的数量。
基于滑动窗口的动态控制方法解决了现行RDMA传输过程需要多次同步内存状态的弊端,提高单边操作传输效率,增加RDMA网络的易用性。以RDMA远程写操作为例,详细步骤如下,远程读操作的实现流程类似。
客户端向服务端,建RC(Reliable Connection)链接,只有RC链接支持全部RDMA操作指令,成功后立即发起recv指令。
服务端,根据业务需要,分配支持远程写入的内存池,由M个长度为m字节的内存块组成,服务端向客户端发送(send指令)内存池信息,具体结构如下表1。
表1 内存池的信息接口
客户端收到内存池的信息后,创建发送窗口,定义循环链表分别保存内存块ID[1,M],至此,收发双方完成滑动窗口初始化,滑动窗口可用空间为M。
某个时刻客户端待发送数据为L字节,滑动窗口空闲空间为r,则实际发送内存块数为:
x = min(ceil(L/m),r)
循环执行write-with-imm指令向远端写x块内存,每个指令立即数为ID值,写指令成功则发送窗囗尾部前移1,写完x内存块发送窗囗尾部前移x。
服务端接收到数据后,立即发给f,则内存f已经写入新数据,业务逻辑处理[f]内存数据,若内存块f数据用完,内存空间可用,则根据当前链路的控制策略发送确认报文。控制策略为NoDelay算法,会立即发送值为f的Ack报文,若为Nagle策略,则会等待下面发送条件满足:
TimeWait〉= MAT || SegAvail > = MAS
TimeWait为当前内存块空闲等待时间,MAT(Max Available Time)为内存块空闲时间阈值,SegAvail为节点当前空闲内存块总数,MAS(Max Available Segments)为空闲内存块数量阈值。
空闲内存块数量为y,则向客户端发送ack报文y。
客户端收到y确认报文后,滑动窗囗头部前移y,发送缓冲区可用空间增加y,后续客户端重复前面步骤发送业务数据,整个缓冲区基于循环队列循环复用滑动窗口内存。
滑动窗囗可用为0时,客户端暂停发送数据,多次出现滑动窗囗耗尽时,双方应该协商增加滑动窗口的范围。
本方法借鉴TCP协议中的滑动窗口机制,实现RDMA单边操作内存可用状态的确认机制;同时将Nagle算法应用到内存确认过程,大大减少ACK确认数量,减少双方交互次数;另外,客户端采用循环队列实现滑动窗口,逻辑简单高效,且支持窗口大小扩展。
为验证本方法可行性,本文对RDMA的远程write操作的做相关测试,测试环境:
网卡类型:Mellanox Technologies MT27520-Family [ConnectX-3 Pro]
交换机:mellanos-switch SX6012/U1 40Gbps QDR
服务器:Centos7 Intel Xeon Silver 4114 CPU@2.20G 128GB内存
通过配置文件为服务端指定由16个内存块组成的内存池,每个内存块大小为1MB,应用层循环向远端写入1GB数据,经过测试验证,采用本方法后,整个数据传输时延降低13%。
RDMA在很多业务产品都已商用,如阿里的PolarFS、华为的FusionStore等,针对RDMA传输应用过程存在的弊端,本文提出一种基于滑动窗口的传输控制方法,通过降低内存状态同步成本,提高RDMA链接传输效率。
[1]吴昊,陈康.基于RDMA和NVM的大数据系统一致性协议研究[J].大数据,2019(04):89-99.
[2]李龙飞,史阳春,王剑峰.面向千兆以太网的动态RDMA通信方法[J].电子科技大学学报,2018(05):672-679.
[3]陈游旻,陆游游.基于RDMA的分布式存储系统研究综述[J].计算机发展与应用,2019(02):227-239.
深圳市科技创新委员会科技应用示范项目资金资助项目(No.SF20170036);国家重点研发计划项目(2018YFB1003302);江苏省工业和信息产业转型升级专项资金项目;南京市工业和信息化发展专项资金项目基金项目