RDMA WRITE/READ
RDMA read和write,不需要实际的send-recv来进行对端操作,本质上是单端操作
流程

忽略key的获取过程,则一次RDMA WRITE操作可近似为
- 请求端APP以WQE(WR)的形式下发一次WRITE任务。
- 请求端硬件从SQ中取出WQE,解析信息。
- 请求端网卡根据WQE中的虚拟地址,转换得到物理地址,然后从内存中拿到待发送数据,组装数据包。
- 请求端网卡将数据包通过物理链路发送给响应端网卡。
- 响应端收到数据包,解析目的虚拟地址,转换成本地物理地址,解析数据,将数据放置到指定内存区域。
- 响应端回复ACK报文给请求端。
- 请求端网卡收到ACK后,生成CQE,放置到CQ中。
- 请求端APP取得任务完成信息。
注意:
- RDMA中的src_addr和dest_addr是虚拟地址,转化为物理地址的操作由硬件网卡来做
- 第6步中的ack操作只能保证数据包中的payload被硬件网卡正确的“暂存”,不能保证一次RDMA操作已经正确完成
总结
RDMA WRITE和READ操作就是在利用网卡完成下面左图的内存拷贝操作而已,只不过复制的过程是由RDMA网卡通过网络链路完成的;而本地内存拷贝则如下面右图所示由CPU通过总线完成的:

通过对比SEND/RECV和WRITE/READ操作,我们可以发现传输数据时不需要响应端CPU参与的WRITE/READ有更大的优势,缺点就是请求端需要在准备阶段获得响应端的一段内存的读写权限(key)。但是实际数据传输时,这个准备阶段的功率和时间损耗都是可以忽略不计的,所以RDMA WRITE/READ才是大量传输数据时所应用的操作类型,SEND/RECV通常只是用来传输一些控制信息。