目前RDMA网络中广泛使用的是RC(Reliable Connected,可靠连接)QP可靠传输服务,在两个通信实例之间创建一对固定的RC QP进行通信,因此单节点上创建QP数量会随着集群规模进行线性增长。由于RDMA QP都是占用的硬件网卡上资源,当单节点上创建大量RDMA QP时,硬件资源可能会被耗尽,从而严重影响性能,这个问题会严重制约RDMA在大规模分布式集群中的部署和应用。
DC QP是一种动态链接可靠(Dynamically Connected, DC)传输服务,不同于使用RC QP,通信实例的源端需要与多个目的端分别创建一个QP进行通信。源端可以利用同一个DC QP与多个目的端进行通信,在发送数据的时候,通过WQE指定目的地即可。利用DC QP可以使用对外多个活跃链接复用在同一个QP上,有效解决硬件资源不足限制大规模RDMA集群的问题。下面对RDMA DC QP的工作原理进行下介绍。
1)1对多通信
通信源端创建DCI QP,目的端创建DCT QP,DCI QP只能用来发包,DCT QP只能用来收包。以源端利用同一个DCI QP分别和目的端A和B的通信过程为例,介绍下MLX DC QP通信流程。首先与目的端A进行通信,DCI QP会先与目的端A的DCT QP进行建链,无需等待A的回复即可发送数据报文,当源端将通信目的端从A切换到B时,DC QP会等待A的报文全部处理完成之后,自动与A拆链,再与B建链,然后发送到目的端B的报文,如果后续源端不再继续发包,那么DC QP会自动完成与目的端B的拆链。所有拆建链的过程都是在硬件中自动完成,无需应用感知。
2)多对1通信
同一个DCT QP,可以同时与多个源端DCI QP进行建链,可以同时接收来自不同DCI QP的数据,硬件中利用DCR用来维护与源端的连接,与源端同时建立链接的数量有上限限制,当接收端资源不足,无法支撑创建新的DC Connection,就会回复CNAK,发送端在触发DC RnR超时后,会进行重传。
3)拆链报文丢失
如果DC Disconnect报文丢失,因为没有ack,发送端不会进行重传;接收端在超出一定的时间,都没有收到过源端发送的报文后,会自动进行资源回收。
4)DC QP和CQ关联模型
不同于RC QP,DCT QP必须要配合SRQ进行使用,1个DCT QP只能关联一个SRQ,1个SRQ可以关联多个DCT QP。Recv cq绑定在DCT QP上进行polling。
5)源端GID携带在CQE中
使用DC QP时,创建CQ时需指定CQE size是128B,源端的GID信息携带在CQE(前64B)中进行上送。cqe->flags_rqpn & htonl((1ul << 28) | (1ul << 29)),第28bit 为1,表示GRH在data中;第29bit为1,表示GRH在CQE中。当携带GRH时,wc中wc_flags 会设置标记位IBV_WC_GRH,wc中src_qpn 表示源端qp的qpn,结合这两个信息,就可以唯一确定数据的源端。
6)性能对比
下表是不同QP类型下在不同消息size下的传输时延对比。
QP type/SIZE |
2B |
4KB |
64KB |
1MB |
RC |
1.70us |
3.18us |
8.30us |
86.58us |
XRC |
1.80us |
3.22us |
8.38us |
86.73us |
DC |
4.84us |
6.39us |
11.99us |
90.79us |
由于DC QP是动态建链机制,当SQ中WQE发送完毕后,会自动与对端拆链,单并发时延场景下每一个WQE都会触发建链和拆链机制,导致小IO单并发场景下,端到端时延要比RC和XRC显著高一些,IOPS场景下带宽性能与RC/XRC基本一致。
总的来说,DC QP可用于超大规模的RDMA网络集群中,既可以像RC QP一样提供可靠传输服务,同时又可以将多个目的地不同的对外连接复用到同一个QP上,节约QP资源。但是单并发场景下,由于DC QP动态建链拆链的特性,会导致WQE完成时延略高于RC QP。用户可根据网络和性能需求,选择适合的传输服务类型。