WQ

Work Queue简称WQ,是RDMA技术中最重要的概念之一,WQ是一个储存工作请求的队列,为了讲清楚WQ是什么,我们先介绍队列中的元素WQE

WQE

WQE可以认为是一种“任务说明”,这个工作请求是软件下发给硬件的,这份说明中包含了软件所希望硬件去做的任务以及有关这个任务的详细信息。比如,某一份任务是这样的:“我想把位于地址0x12345678的长度为10字节的数据发送给对面的节点”,硬件接到任务之后,就会通过DMA去内存中取数据,组装数据包,然后发送。

WQE的含义应该比较明确了,那么我们最开始提到的WQ是什么呢?它就是用来存放“任务书”的“文件夹”,WQ里面可以容纳很多WQE,相当于先进先出的队列。

所有通信请求都按照上图这种方式告知硬件,这种方式常被称为“Post”。

QP

Queue Pair简称QP,就是一对WQ的意思。

SQ和RQ

Send Queue和Receive Queue,任何通信过程收发两端队列,QP就是一个SQ和一个RQ的组合

SQ和RQ都是WQ!

在一次SEND-RECV流程中,发送端需要把表示一次发送任务的WQE放到SQ里面。同样的,接收端软件需要给硬件下发一个表示接收任务的WQE,这样硬件才知道收到数据之后放到内存中的哪个位置。

RDMA通信的基本单元是QP

对于每个节点来说,每个进程可以使用若干个QP,而每个本地QP可以关联一个远端的QP,一次RDMA通信类似于“节点A上的QP3给节点上C上的QP4发送数据

每个节点的每个QP都有一个唯一的编号,称为QPN(Queue Pair Number),通过QPN可以唯一确定一个节点上的QP。

SRQ

Shared Receive Queue简称SRQ,意为共享接收队列。概念很好理解,就是一种几个QP共享同一个RQ时,我们称其为SRQ。用RQ的情况要远远小于使用SQ,而每个队列都是要消耗内存资源的。当我们需要使用大量的QP时,可以通过SRQ来节省内存。

CQ

Completion Queue简称CQ,意为完成队列。可以认为CQ是WQ的相反概念,如果WQE是任务书的话,CQE就是任务报告,CQE描述任务是否被正确执行,如果不是则错误原因是什么。

  1. 接收端APP以WQE的形式下发一次RECV任务到RQ。
  2. 发送端APP以WQE的形式下发一次SEND任务到SQ。
  3. 发送端硬件从SQ中拿到任务书,从内存中拿到待发送数据,组装数据包。
  4. 发送端网卡将数据包通过物理链路发送给接收端网卡。
  5. 接收端收到数据,进行校验后回复ACK报文给发送端。
  6. 接收端硬件从RQ中取出一个任务书(WQE)。
  7. 接收端硬件将数据放到WQE中指定的位置,然后生成“任务报告”CQE,放置到CQ中。
  8. 接收端APP取得任务完成信息。
  9. 发送端网卡收到ACK后,生成CQE,放置到CQ中。
  10. 发送端APP取得任务完成信息。

WR和WC

WR全称为Work Request,意为工作请求;WC全称Work Completion,意为工作完成。这两者其实是WQE和CQE在用户层的“映射”。

因为APP是通过调用协议栈接口来完成RDMA通信的,WQE和CQE本身并不对用户可见,是驱动中的概念。用户真正通过API下发的是WR,收到的是WC

总结

IB协议

用户态的WR,由驱动转化成了WQE填写到了WQ中,WQ可以是负责发送的SQ,也可以是负责接收的RQ。硬件会从各个WQ中取出WQE,并根据WQE中的要求完成发送或者接收任务。任务完成后,会给这个任务生成一个CQE填写到CQ中。驱动会从CQ中取出CQE,并转换成WC返回给用户。