设置最大未完成工作请求以放入 RDMA 中队列对的发送队列

Setting max outstanding work requests to be put on a Send Queue of a Queue Pair in RDMA

我正在尝试使用 ibv_create_qp() 创建队列对,我必须通过设置 struct ibv_qp_cap 的字段并将其提供给创建函数来描述队列对的大小。我的问题是 max_send_wr 字段,它对应于可以发布到该特定队列对的发送队列的最大未完成工作请求数。

根据各种网络资源 [1,2],您应该将此特定字段设置在 [0 ... dev_cap.max_qp_wr] 范围内的某个位置,其中 max_qp_wr 是最大数量RDMA 设备支持的任何发送或接收队列上未完成的工作请求数(您可以通过使用 ibv_devinfo -v 查询您的设备来获取信息)。在尝试创建 QueuePair 时,当我将字段设置为最大可能值(max_qp_wr,对于我的设备来说是 32K)时,ibv_create_qp() 函数失败并出现 ENOMEM 错误。通过反复试验,我发现如果我将它降低到 8K,它就可以正常工作。

因此,我很想知道是否有确定性的方法来计算 RDMA 设备的 max_send_wr 值而无需反复试验?此外,根据一些 [1],对于特定的 RDMA 设备,可能存在发送或接收队列的其他注意事项,以防止创建具有最大值的 QP。这些特定于 RDMA 设备的考虑因素是什么?它们如何影响最大值的计算?

[1] https://www.rdmamojo.com/2012/12/21/ibv_create_qp/

[2] https://linux-rdma.vger.kernel.narkive.com/rkR0gUjT/rdma-create-qp-and-max-send-wr

我不确定是否有确定性和可移植的方式来回答您的问题。在某些设备中,设备对工作队列大小而不是条目数(例如 Mellanox 设备)提出了限制,因此根据其他参数(例如最大内联大小和分散 - 聚集条目),实际数量可以发送工作请求。

虽然这是两年前的问题,但我只想指出,当您在 max_send_wr 中指定一个数字时,设备驱动程序会尝试分配比该数字更大的大小(主要是数字2) 的幂。我建议您深入研究驱动程序代码,了解这种计算是如何进行的。

在实践中,如果你真的想达到你可以为QP设置的最大大小,你可以先测试你可以设置的最大max_send_wr,然后添加IBV_EXP_QP_CREATE_IGNORE_SQ_OVERFLOWIBV_EXP_QP_CREATE_IGNORE_RQ_OVERFLOW,这样你在max_send_wr限制后仍然可以post WR。