本文翻译自英文博客,原文地址:https://www.rdmamojo.com/2013/06/01/which-queue-pair-type-to-use/
在编写RDMA应用程序时(就像在套接字上编写应用程序时一样),应该决定使用哪种QP类型。
在这篇文章中,我将详细描述每种传输类型的特征。
在RDMA中,有三种QP类型。它们可以表示为: XY
X可以是:
可靠的(Reliable): 有一个保证,即消息最多被传递一次,有顺序,没有损坏。
不可靠(Unreliable): 不能保证消息将被传递,也不能保证包的顺序。
在RDMA中,每个包都有一个CRC,被破坏的包被丢弃(对于任何传输类型)。QP传输类型的可靠性是指整个消息的可靠性。
Y可以是:
连接(Connected): 一个QP只与一个QP 发生send/receive操作
无连接(Unconnected):一个QP可与任意个QP发生send/receive操作
在RDMA中使用了以下机制:
* CRC: CRC字段,用于验证包是否沿路径损坏。
* PSN: 数据包序列号确保订单接收到数据包。这有助于检测丢失的包和包复制。
* ack: (仅在可靠的连接(RC)中)只有在应答方成功写入消息后,才会将ack包发送回请求方。如果请求者没有接收到ack,它将根据QP的属性重新发送消息。如果QP中没有任何ack(或nack),它将报告有一个错误(重试超出)。如果在响应端(保护、资源等)有任何类型的错误,一个ack将被发送到请求者,它将报告有一个错误。
Reliable Connected (RC) QP
一个RC QP被可靠地连接到一个RC QP上(即发送和接收消息)。可以保证消息从请求者最多一次传递到响应者,且顺序正确且没有损坏。支持的最大消息大小为2GB(这个值可能更低,取决于支持的RDMA设备属性)。RC QP支持send操作(w/o immediate)、RDMA writ操作(w/o immediate)、RDMA read操作和atomic操作(取决于原子操作中的RDMA设备支持级别)。
如果消息大小大于MTU,则它在发送数据的端被分割,在接收端被重新组装。
请求者一旦接收到来自响应方将消息读/写进内存的ack,就认为消息传递完成了。
接收端在消息被读/写其(本地)内存后,认为一个消息操作完成。
Unreliable Connected (UC) QP
一个UC QP正在以不可靠的方式连接到一个UC QP上(即发送和接收消息)。不能保证消息将被另一方接收:损坏的或序列不一致的包将被丢弃。如果一个信息包被丢弃,那么它所属的整个消息都将被丢弃。在这种情况下,接收端不会停止,而是继续接收传入的数据包。包的顺序没有任何保证。支持的最大消息大小为2GB(这个值可能更低,取决于支持的RDMA设备属性)。RC QP支持send操作(w/o即时)和RDMA write操作(w/o即时)。
如果消息大小大于MTU,则它在发送数据的端被分割,在接收端被重新组装。
请求者认为,在将所有消息发送到链路之后,消息操作就完成了。
接收端在消息被读/写其(本地)内存后,认为一个消息操作完成。
Unreliable Datagram (UD) QP
一个QP可以不可靠地以单播(一对一)或多播(一对多)的方式向任何其他UD QP发送和接收消息。不能保证消息将被另一方接收:损坏的或顺序不一致的包将被丢弃。包的顺序没有任何保证。支持的最大消息大小是最大MTU。UD QP只支持send操作。
请求者认为,在将所有消息发送到链路之后,消息操作就完成了。
接收端在消息被读/写其(本地)内存后,认为一个消息操作完成。
选择合适的QP类型
选择正确的QP类型对于应用的正确性(correction)和可拓展性(scalability)至关重要。
在下列情况下,应选择RC QP:
网络的可靠性是需要的
网络带宽不高或集群很大,但并非所有节点都向同一节点发送流量(一个受害者)
RC QP的几种用途是:RDMA上的FTP或RDMA上的文件系统。
在下列情况下,应选择UC QP:
不需要网络保证可靠性(例如,可靠性根本不重要,或者由应用程序处理)
网络带宽不高或集群很大,但并非所有节点都向同一节点发送流量(一个受害者)
大规模数据(比MTU路径更大)需要传输
UC QP的一个用途是:通过RDMA传输视频。
在下列情况下,应选择UD QP:
不需要网络保证可靠性(例如,可靠性根本不重要,或者由应用程序处理)
网络带宽很高,所有节点和每个节点都向网络中的任何其他节点发送消息。UD是解决可拓展性问题的最佳解决方案之一。
需要多播消息
UD QP的一个用途是:通过RDMA语音。
总结