如何在ConnectX-6 InfiniBand/VPI适配器中动态修改QP速率限制
问题原因与解决方法
1. ah_attr.static_rate 无法动态修改的原因
ah_attr.static_rate 是QP进入RTR(Ready to Receive)阶段时加载的静态AH属性,硬件只会在QP初始化状态机流转到RTR阶段读取一次该配置,QP进入RTS(Ready to Send)运行态后,再修改该字段调用ibv_modify_qp不会触发硬件重配置,自然不生效。
2. ibv_modify_qp_rate_limit() 返回EINVAL的核心原因
你当前的调用方式缺少必填配置,以下是触发EINVAL的常见场景:
- 未填写必填字段
rate_limit_type:该字段不能为0,ConnectX-6支持两种限速类型,硬限速场景需显式赋值IBV_QP_RATE_LIMIT_UNCONTENDED,字段留0会直接被驱动校验拦截。 - 速率值不符合要求:该API的
rate_limit单位为Mbps,不是Gbps,取值不能超过端口当前协商的物理链路最大速率(比如100G链路最大值为100000),超出范围会返回错误。ConnectX-6硬件限速粒度为1Mbps,支持任意整数Mbps的速率配置,无需对齐固定档位。 - 环境不支持该特性:调用前需确认满足以下前置条件:
- ConnectX-6固件版本 >= 20.30.0000,老版本固件未开放动态QP限速控制接口
- 设备能力flag包含
IBV_DEVICE_QP_RATE_LIMIT,可通过ibv_query_device查询,无该flag说明驱动/固件不支持该特性 - 仅RC、UC、UD类型QP支持该接口,Raw QP、XRC QP在ConnectX-6上不支持独立动态限速
- 使用的rdma-core版本 >= v35,或MLNX_OFED版本 >= 5.4,低版本用户态库存在接口封装bug,会导致调用失败
正确调用示例
struct ibv_qp_rate_limit_attr rl_attr; memset(&rl_attr, 0, sizeof(rl_attr)); // 配置为无竞争场景硬限速 rl_attr.rate_limit_type = IBV_QP_RATE_LIMIT_UNCONTENDED; // 示例:设置为40Gbps,对应值为40000Mbps rl_attr.rate_limit = 40000; int ret = ibv_modify_qp_rate_limit(qp, &rl_attr); if (ret) { fprintf(stderr, "Set QP rate limit failed, errno=%d, errstr=%s\n", errno, strerror(errno)); }
该接口可以在QP运行态(RTS阶段)动态调用,修改后立即生效,不需要重置QP状态机。
3. 全局端口级硬件限速配置方法
如果需要对整个端口的所有流量配置全局限速,不需要逐QP修改,直接调用ibv_modify_port接口,设置port_attr.max_rate字段即可,该配置为端口级硬限速,所有经过该端口的发送流量都会受速率限制。
内容的提问来源于stack exchange,提问作者Dillion Wang
相关产品推荐
相关产品推荐

