RDMA支持多种通信方式,常见的包括:Send(发送)和Receive(接收)、RDMA Write、RDMA Read。哈哈哈,今天我们就来了解一下这些通信原语的通信过程。
这次分享需要提前了解的基础知识在:
RDMA通信2:一张图了解 RDMA基本元素和组成 通信过程元素关系解析 视频教程_rdma的基本元素-CSDN博客
视频教程在这:
13. RDMA基本操作类型Send Recv机制和通信过程_哔哩哔哩_bilibili
1.4 RDMA基本操作类型Write,Read机制和通信过程_哔哩哔哩_bilibili
一、Send/Recv
Send/Recv是一种两端cpu都需要参与的双端操作,并且Recv端需要提前显式的下发WQE(工作队列元素,也就是任务)给硬件,否则硬件无法知道该怎么处理接收到的数据(例如把数据保存到内存的哪个地方)。
如下图所示,左边计算机1是发送端,右边计算机2是接受端。
发送端流程:
1、应用程序调用Verbs API ibv_post_send,发出一个发送WR(工作请求)
2、WR在驱动层被转化为WQE,并添加到SQ(发送工作队列)中
3、告知硬件,发送数据本地内存地址,数据长度,并进行发送操作
接收端流程:
1、应用程序调用Verbs API ibv_post_revc,发出一个接收WR(工作请求)
2、WR在驱动层被转化为WQE,并添加到RQ(接收工作队列)中
3、告知硬件,将接收到的数据保存到特定位置
发送端每次发送数据时,接收端都需要提前准备好接收数据的缓存。在发送端发送数据之前,接收端就已经调用ibv_post_revc,通知驱动程序向RQ中添加WQE,告知硬件将接受数据保存到起始地址位0x11110000,长度为100的本地数据缓存中。
二、RDMA Write
RDMA Write是一种单端操作,远端cpu不需要参与,也感知不到何时有数据写入,以及何时写完。
如下图所示,左边计算机1是发送端(更准确的描述是请求端),右边计算机2是接受端(更准确的描述是响应端)。
请求端流程:
1、应用程序调用Verbs API ibv_post_send,发出一个发送WR(工作请求)
2、WR在驱动层被转化为WQE,并添加到SQ(发送工作队列)中
3、告知硬件,发送数据本地内存地址,数据长度,写入的目的地址
响应端流程:
1、cpu不参与,硬件网卡完成数据写入。
进行RDMA Write需先做好一定准备:分配缓存、注册MR、交换缓存地址和密钥等信息(可通过socket,也可通过RDMA send/recv交换信息)。计算机1需获得对端计算机2一块远端内存的读写权限。
RDMA Write工作流程详细描述:
1、请求端软件向SQ(发送工作队列)中添加一个WQE,下发一个RDMA Write任务给RDMA网卡。
2、请求端RDMA网卡解析WQE,获取源数据缓存的虚拟地址、目的数据缓存的虚拟地址、数据长度(量)、远端密钥(R_key)等信息。
3、请求端RDMA网卡源数据缓存的虚拟地址,查询地址转化表,得到物理地址,然后通过DMA操作将待发送的数据从主机内存负责到RDMA网卡内部缓存,并按协议封装成数据包。
4、请求端RDMA网卡将数据包通过物理链路发送给响应端RDMA网卡。
5、响应端RDMA网卡接收数据包,并按协议解包得到数据和目的缓存虚拟地址,查询本地MR地址转化表得到目的缓存物理地址,把数据写入目的缓存。
6、响应端RDMA网卡回复ACK报文给请求端RDMA网卡。
7、请求端网卡接收到ACK后,添加一个CQE(完成队列元素)到CQ中。
8、请求端软件通过轮询得到CQE,得到任务完成的信息。
三、RDMA Read
RDMA Read和RDMA Write一样,也是一种单端操作,工作流程和RDMA Write非常相似,主要区别就是WQE的操作码不同,导致相反的数据传输方向。
如下图所示,左边计算机1是发送端(更准确的描述是请求端),右边计算机2是接受端(更准确的描述是响应端)。
请求端流程:
1、应用程序调用Verbs API ibv_post_send,发出一个发送WR(工作请求)
2、WR在驱动层被转化为WQE,并添加到SQ(发送工作队列)中
3、告知硬件,从计算机2的内存中,读取特定长度的数据,到本地内存。
响应端流程:
1、cpu不参与,硬件网卡完成数据写入。
RDMA Read工作流程详细描述:
1、请求端软件向SQ(发送工作队列)中添加一个WQE,下发一个RDMA Read任务给RDMA网卡。
2、请求端RDMA网卡解析WQE,获取对端源数据缓存的虚拟地址、本地目的数据缓存的虚拟地址、数据长度(量)、远端密钥(R_key)等信息。
3、请求端网卡将RDMA Read请求数据包通过物理链路发送给响应端网卡。
4、响应端RDMA网卡收到请求数据包,解析出源数据缓存的虚拟地址,查询响应端本地地址转化表,得到物理地址,并根据物理地址读取数据到RDMA网卡内部缓存。
5、响应端RDMA网卡将数据封装成回复数据包,通过物理链路发送给请求端网卡。
6、请求端RDMA解析回复数据包,查询本地MR地址转化表得到目的缓存物理地址,把数据写入目的缓存。
7、请求端网卡接添加一个CQE(完成队列元素)到CQ中。
8、请求端软件通过轮询得到CQE,得到任务完成的信息。
参考资料:
Linux高性能网络详解,从DPDP、RDMA到XDP