MLNX_OFED 的 RoCE 连接问题(RDMA over Converged Ethernet)

RoCE connection problem with MLNX_OFED (RDMA over Converged Ethernet)

我正在尝试让 RoCe(聚合以太网上的 RDMA)在两个工作站上工作。我在两台配备 Mellanox ConnectX-5 EN 100GbE 适配器并通过相应电缆直接相互连接的计算机上安装了 MLNX_OFED。根据我读到的内容,我需要子网管理器运行在其中一个工作站上运行,以便它能够在它们之间使用 RoCe。

当尝试 运行 命令 opensm 时,它说找不到本地端口。我可以 ping 通两台计算机,并且可以正常工作。我还可以使用命令 udaddy 来测试 RDMA,它也能正常工作。但是尝试 运行 本指南中介绍的 RDMA_RC_EXAMPLE https://www.mellanox.com/related-docs/prod_software/RDMA_Aware_Programming_user_manual.pdf 它在尝试创建队列对时失败了,更具体地说,当它试图将状态更改为 RTR(准备接收)时。

还有一些消息来源说你需要一个 RDMA 服务,我的电脑上没有。 MLNX_OFED 的安装在 /etc/yum.conf 中排除了 ibutils-libs*,我不知道它是否相关,但我注意到了。

我运行在其中一台机器上安装 CentOS 7.7,在另一台机器上安装 CentOS 7.8。

有点纳闷到底哪里出了问题。

更新 这是 运行 代码时中断的函数。

/******************************************************************************

 * Function: modify_qp_to_rtr

 *

 * Input

 * qp QP to transition

 * remote_qpn remote QP number

 * dlid destination LID

 * dgid destination GID (mandatory for RoCEE)

 *

 * Output

 * none

 *

 * Returns

 * 0 on success, ibv_modify_qp failure code on failure

 *

 * Description

 * Transition a QP from the INIT to RTR state, using the specified QP number

 ******************************************************************************/
static int modify_qp_to_rtr (struct ibv_qp *qp, uint32_t remote_qpn, uint16_t dlid, uint8_t * dgid)

{

    struct ibv_qp_attr attr;

    int flags;

    int rc;

    memset (&attr, 0, sizeof (attr));

    attr.qp_state = IBV_QPS_RTR;

    attr.path_mtu = IBV_MTU_256;

    attr.dest_qp_num = remote_qpn;

    attr.rq_psn = 0;

    attr.max_dest_rd_atomic = 1;

    attr.min_rnr_timer = 0x12;

    attr.ah_attr.is_global = 0;

    attr.ah_attr.dlid = dlid;

    attr.ah_attr.sl = 0;

    attr.ah_attr.src_path_bits = 0;

    attr.ah_attr.port_num = config.ib_port;

    if (config.gid_idx >= 0)

    {

        attr.ah_attr.is_global = 1;

        attr.ah_attr.port_num = 1;

        memcpy (&attr.ah_attr.grh.dgid, dgid, 16);

        attr.ah_attr.grh.flow_label = 0;

        attr.ah_attr.grh.hop_limit = 1;

        attr.ah_attr.grh.sgid_index = config.gid_idx;

        attr.ah_attr.grh.traffic_class = 0;

    }

    flags = IBV_QP_STATE | IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN |

        IBV_QP_RQ_PSN | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER;

    rc = ibv_modify_qp (qp, &attr, flags);

    if (rc)

        fprintf (stderr, "failed to modify QP state to RTR\n");

    return rc;

}

这个消息来源 RoCE Debug flow Linux

RoCE requires an MTU of at least 1024 bytes for net payload.

我猜这会影响代码中的这一行:

attr.path_mtu = IBV_MTU_256;

当更改为 IBV_MTU_1024 时,它编译但给出相同的错误。

已解决

使用 RoCE 时,您需要按照@haggai_e 的说明指定 GID 索引。我认为使用 Infiniband 而不是 RoCE 时不需要它。

当 运行 进行 qperf RDMA 测试时,我们还需要将其连接管理器标志设置为 运行。我假设它具有与使用 Infiniband 而不是 RoCE 时需要使用的子网管理器相同的功能。