RDMA因为其kernel-bypass,zero-copy,cpu offload三种特性,能够提供低延迟、高吞吐的数据传输性能。
使用RDMA进行数据传输时,read/write在client/server端的具体操作可以概括为以下步骤:
1. 初始化连接和注册内存区(Memory Region);
2. 建立连接;
3. 使用send/receive verbs在client和server间传递内存区地址(addr)和key;
4. 发出read/write请求;
5. 断开连接。
为了详细的描述上述过程,在第2步建立连接以后,Client端执行以下操作:
1. 使用MSG_MR消息发送内存区的地址和key;
2. 等待接收Server端发来的包含内存区地址和key的MSG_MR消息;
3. 发出read/write请求;
4. 向Server端发送MSG_DONE消息,通知Server端准备断开连接;
5. 等待Server端的MSG_DONE消息;
6. 断开连接。
Server端的操作流程是类似的:
1. 等待Client端的MSG_MR消息;
2. 使用MSG_MR消息发送内存区的地址和key;
3. 发出read/write请求;
4. 向Client端发送MSG_DONE消息,通知Client端准备断开连接;
5. 等待Server端的MSG_DONE消息;
6. 断开连接。
为了避免断开连接影响read/write操作的正常进行,通信双方必须在断开连接前等待MSG_DONE消息。但是,二者在发出MSG_DONE消息时不需要等待read/write请求结束,因为InfiniBand的特点是请求将按发起的顺序被依次执行。这意味着在read/write操作完成之前,另一方不会收到MSG_DONE。