• RDMA技术整理3 RDMA基本功能

    RDMA基本元素

    参考于知乎专栏

    | 缩略语 | 全称 | 含义 |
    | —— | ———————— | ———————————————————— |
    | WQ | Work Queue | 储存工作请求的队列 |
    | WQE | Work Queue Element | 工作队列里面的元素 |
    | QP | Queue Pair | 一对WQ,包括了SQ,RQ;通信的基本单元 |
    | SQ | Send Queue | QP中的发送端队列 |
    | RQ | Receive Queue | QP中的接受端队列 |
    | SRQ | Shared Receive Queue | 共享接收队列,几个QP共享同一个RQ时,我们称其为SRQ |
    | CQ | Completion Queue | 完成队列,承载CQE的容器,一个先进先出的队列 |
    | CQE | Completion Queue Element | 如果WQE是软件下发给硬件的“任务书”的话,那么CQE就是硬件完成任务之后返回给软件的“任务报告”。 |
    | WR | Work Request | 工作请求,WQE和CQE在用户层的“映射” |
    | WC | Work Completion | 工作完成,WQE和CQE在用户层的“映射” |

    RDMA基本元素

    RMDA基本操作

    RDMA有two-sided和one-sided的区别,一般情况下涉及大量数据的收发更多使用的是one-sided操作,另外在resource-disaggregation的场景中也一般使用one-sided的操作,因为memory节点在设计中往往不会给强力的CPU;

    RDMA双端操作 SEND & RECV

    双端操作的含义是:完成一次通信过程需要两端CPU的参与,并且接收端需要提前显式下发WQE( Work Queue Element);

    SEND-RECV操作

    在SEND-RECV操作中,不仅仅发送端需要下发WQE,接收端也需要下发WQE,目的是告诉硬件收到的数据要放到哪一个地址,发送端并不知道发送的数据会放到哪里,因此每一次发送数据的时候接收端需要提前准备好接受Buffer;具体如上图(另外执行顺序并不完全和上面的顺序一致,比如步骤8 11 12和步骤9 10的先后是不一定的)

    这部分在下一篇博客中有具体的实现。

    RDMA one-sided 操作 WRITE & READ

    one-sided的含义在于,除了准备阶段,服务端的CPU都不需要参与,也不需要感知数据写入和结束接受的过程,因此称为是one-sided的。

    在进行WRITE和READ操作之前,首先会经历准备阶段,也就是请求端需要获得响应端某块内存的权限,具体而言:对于RDMA,响应者的buffer被描述成为一个虚拟地址(VA,Virtual Address)和一个R-KEY;在WRITE或者READ操作开始之前,响应方会把这个buffer的控制权传递给请求方,请求方会控制缓冲区,知道控制权传回到响应程序;这个准备过程通常可以用SEND/RECV来完成。完成了之后响应端的CPU就不会再参与数据收发的过程,解放了远端CPU,降低了通信时延。另外虚拟地址–物理地址的转换是通过RDMA网卡来完成的。

    接下来是WRITE操作的流程:

    WRITE操作

    1. 请求端APP以WQE(WR)的形式下发一次WRITE任务。
    2. 请求端硬件从SQ中取出WQE,解析信息。
    3. 请求端网卡根据WQE中的虚拟地址,转换得到物理地址,然后从内存中拿到待发送数据,组装数据包。
    4. 请求端网卡将数据包通过物理链路发送给响应端网卡。
    5. 响应端收到数据包,解析目的虚拟地址,转换成本地物理地址,解析数据,将数据放置到指定内存区域。
    6. 响应端回复ACK报文给请求端。
    7. 请求端网卡收到ACK后,生成CQE,放置到CQ中。
    8. 请求端APP取得任务完成信息。

    READ是WRITE相反的过程,是请求端主动读取响应端内存的行为,要注意到”读“这个动作的数据是附带在响应端回复的报文里面的,具体流程如下:

    READ操作

    1. 请求端APP以WQE的形式下发一次READ任务。
    2. 请求端网卡从SQ中取出WQE,解析信息。
    3. 请求端网卡将READ请求包通过物理链路发送给响应端网卡。
    4. 响应端收到数据包,解析目的虚拟地址,转换成本地物理地址,解析数据,从指定内存区域取出数据。
    5. 响应端硬件将数据组装成回复数据包发送到物理链路。
    6. 请求端硬件收到数据包,解析提取出数据后放到READ WQE指定的内存区域中。
    7. 请求端网卡生成CQE,放置到CQ中。
    8. 请求端APP取得任务完成信息。

    通过RDMA的READ,WRITE操作,其实可以发现这个和本地内存拷贝非常像,只不过一个是用RDMA网卡一个使用CPU来做罢了。

参考资料