关于libibverbs中send操作执行顺序及相关问题的技术问询
Libibverbs Send操作流程相关问题解答
问题1:原执行顺序是否正确且有保障?步骤3和5的推送顺序是否固定?
原流程的顺序没有严格的全局保障,尤其是步骤3(接收方推送IBV_WC_RECV元素)和步骤5(发送方推送IBV_WC_SEND元素)的顺序并不固定:
- 以常用的可靠连接(RC)模式为例,RDMA协议仅保证数据的可靠传递,但完成队列(CQ)元素的推送时机受硬件处理速度、网络延迟、本地驱动调度逻辑等多种因素影响;
- 既可能出现接收方先完成数据写入,先推送
IBV_WC_RECV的情况;也可能发送方硬件先确认数据已发出/进入网络链路,先推送IBV_WC_SEND的情况; - 极端场景下两者的CQ元素推送可能几乎同步,应用层poll到的顺序完全不确定。
因此原流程中步骤3→4→5→6的固定顺序是没有协议或驱动层面强制保障的,应用代码绝对不能依赖这个顺序来实现核心逻辑。
问题2:接收方的内存缓冲区何时完成更新?
接收方的内存缓冲区在步骤2与3之间就已经完成数据更新。
RDMA硬件的处理逻辑是:完成数据接收并写入到预先注册的内存缓冲区后,才会将IBV_WC_RECV完成队列元素推入CQ(步骤3)。而步骤4的ibv_poll_cq()只是让应用层感知到这个完成事件,数据实际在步骤3触发前就已经写入缓冲区——无论应用层是否立即poll CQ,缓冲区里的数据都是完整可用的。
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

