本文将mark下RDMA SRQ(Shared Receive Queue)/XRC(eXtended Reliable Connection)/DCT(Dynamically Connected Transport)技术相关notes。

1. SRQ

1.1 为什么需要SRQ

在没有SRQ的情况下,因为RC/UC/UD的接收方不知道对端什么时候会发送过来多少数据,所以必须做好最坏的打算,做好突发性收到大量数据的准备,也就是向RQ中下发足量的的接收WQE;另外RC服务类型可以利用流控机制来抑制发送方,也就是告诉对端”我这边RQ WQE不够了”,这样发送端就会暂时放缓或停止发送数据。

但是第一种方法由于是为最坏情况准备的,大部分时候有大量的RQ WQE处于空闲状态未被使用,这对内存是一种极大地浪费(主要是WQE指向的用于存放数据的内存空间);第二种方法虽然不用下发那么多RQ WQE了,但是流控是有代价的,即会增加通信时延。

而SRQ通过允许很多QP共享接收WQE(本身其实不是很大)以及用于存放数据的内存空间(这可是很大一块内存)来解决上面的问题。当任何一个QP收到消息后,硬件会从SRQ中取出一个WQE,根据其内容存放接收到的数据,然后硬件通过Completion Queue来返回接收任务的完成信息给对应的上层用户。

1.2 SRQ Limit

SRQ可以设置一个阈值,当队列中剩余的WQE数量小于阈值时,这个SRQ就会上报一个异步事件。提醒用户“队列中的WQE快用完了,请下发更多WQE以防没有地方接收新的数据”。这个阈值就被称为SRQ Limit,这个上报的事件就被称为SRQ Limit Reached。

2. XRC

2.1 为什么需要XRC

当前的计算节点一般都有多核,因此可以运行多进程。在这样的计算节点组成的集群中,如果想用RC连接建立full mesh的全连接拓扑时,每个节点就需要建立N*p*p个QP(这里假设集群有N个节点,每个节点上有p个进程,需要让任何2个进程都连通)。当集群扩张,N和p同时增长时,一个节点所需的RC QP资源将变得不可接受。

XRC的思想是当一个进程想与某个远程节点的p个进程通信时不需要跟各个进程建立p个连接而只需要跟对端节点建立一个连接,连接上传输的报文携带了对端目的进程号(XRC SRQ),报文到达连接对端(XRC TGT QP)时根据进程号分发至各个进程对应的XRC SRQ。这样源端进程只需要创建一个源端连接(XRC INI QP)就能跟对端所有进程通信了,这样所需总的QP数量就会除以p。

2.2 核心概念

上图中XRC下标xyz的含义:x代表发起端的node号,y代表发起端的进程号,z代表接收端的node号。

  • XRC INI QP

XRC发起端QP,是XRC操作的源端队列,用于发出XRC操作,但它没有接收XRC操作的功能,对比常规RC QP来说可以认为它是只有SQ没有RQ。XRC操作在对端由XRC TGT QP处理。

  • XRC TGT QP

XRC接收端QP,它处理XRC操作将其分发至报文SRQ number对应的SRQ。XRC TGT QP只能接收XRC操作,但它没有发出XRC操作的功能,对比常规RC QP来说可以认为它是只有RQ没有SQ。XRC操作在对端由XRC INI QP发出。

  • XRC SRQ

接收缓冲区(receive WQE)被放在XRC SRQ中以接收XRC请求,XRC请求中携带了XRC SRQ number,所以XRC TGT QP收到报文后会从报文指定的XRC SRQ中取receive WQE来存放XRC请求。

  • XRC domain

用于关联XRC TGT QP和XRC SRQ,XRC报文只能指定与XRC TGT QP在同一domain内的XRC SRQ,否则报文会被丢弃。这起到了隔离资源的作用,防止攻击报文随意指定XRC SRQ。

XRC INI QP和XRC TGT QP是一一对应的,host2上的每个进程在远端节点host0上都有自己对应的XRC TGT QP。XRC的共享体现在一个XRC TGT QP可以分发至多个XRC SRQ。一个进程一般只有一个XRC SRQ,它可以接收多个XRC TGT QP来的包。

3. DCT

Dynamically Connected transport (DCT) service is an extension to transport services to enable a higher degree of scalability while maintaining high performance for sparse traffic. Utilization of DCT reduces the total number of QPs required system wide by having Reliable type QPs dynamically connect and disconnect from any remote node. DCT connections only stay connected while they are active. This results in smaller memory footprint, less overhead to set connections and higher on-chip cache utilization and hence increased performance.

3.1 为什么需要DCT

UD虽然扩展性很好,但是不支持read/write单边语义。RC虽然支持read/write单边语义,但是扩展性不好。DCT的初衷就是融合2者的优点,保持RC的read/write单边语义和可靠连接特性,同时像UD一样用一个QP去跟多个远端通信,保持良好的可扩展性。DCT一般用于sparse traffic场景。

想用RC连接建立full mesh的全连接拓扑时:

  • 在RC机制下,每个节点就需要建立N*p*p个QP
  • 在XRC机制下,每个节点就需要建立N*p个QP
  • 在DCT机制下,每个节点就需要建立p(可能p+n)个QP

3.2 什么是DCT

  • Dynamic Connectivity
  • Each DC Initiator can be used to reach any remote DC Target

DCT具有非对称的API:DC在发送侧的部分称为DC initiator(DCI),在接收侧的部分称为DC target(DCT)。DCI和DCT不过是特殊类型的QP,它们依然遵循基本的QP操作,比如post send/receive。

DC意味着临时连接,在DCI上发送的每个send-WR都携带了目的地址信息,如果DCI当前连接的对端不是send-WR里携带的对端(node地址不一样),则它会首先断开当前的连接,再连接到send-WR里携带的对端。只要后续的send-WR里携带的都是当前已连接对端,则都可以复用当前已建立的连接。如果DCI在一段指定的时间内都没有发送操作则也会断开当前连接。注意DCT每次临时建立的是一个RC可靠连接。

3.3 思考

DCT preserves their core connection-oriented design, but dynamically creates and destroys one-to-one connections. This provides software the illusion of using one QP to communicate with multiple remote machines, but at a prohibitively large performance cost for our workloads: DCT requires three additional network messages when the target machine of a DCT queue pair changes: a disconnect packet to the current machine, and a two-way handshake with the next machine to establish a connection[FaSST, OSDI’16].

所以DCT在sparse traffic场景中,性能才高。

3.4 XRC vs DCT

  • XRC: 发起端进程与不同node通信时,需要与不同node都建立XRC连接
  • DCT: 发起端进程与不同node通信时,只需建立一个连接;当发起端进程需要与新node通信时,先与原先的node断连,再与新node建连,从而达到只用一个连接的目标

参考资料:

  1. RDMA 高级
  2. Savir专栏:11. RDMA之Shared Receive Queue
  3. Advanced Transport
  4. Dynamically Connected Transport
  5. FaSST: Fast, Scalable and Simple Distributed Transactions with Two-Sided (RDMA) Datagram RPCs