Skip to the content.

RDMA 网卡配置指南

[!NOTE] 参考神奇海螺的意见,有待验证

硬件信息

项目
设备名 mlx5_0
网卡接口 enp0s6np0
型号 Mellanox ConnectX-5 (MT4119)
驱动 mlx5_core
固件 16.31.1014
MAC 8c:2a:8e:40:a3:7c
协议 RoCE (RDMA over Converged Ethernet)
IP 地址 10.0.3.1/30

设备状态检查

# 查看 RDMA 设备列表
rdma dev

# 查看 RDMA 链路状态
rdma link

# 详细设备信息
ibstat

# 或使用 ibv_devinfo
ibv_devinfo

预期输出:

$ rdma dev
0: mlx5_0: node_type ca protocol roce fw 16.31.1014

$ rdma link
link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev enp0s6np0

$ ibstat
CA 'mlx5_0'
    CA type: MT4119
    Number of ports: 1
    Firmware version: 16.31.1014
    Port 1:
        State: Active
        Physical state: LinkUp
        Rate: 10
        Link layer: Ethernet

网络配置

当前配置

地址 用途
10.0.3.0 网络地址
10.0.3.1 本机 IP
10.0.3.2 对端可用 IP
10.0.3.3 广播地址

修改 IP 配置

# 使用 NetworkManager 修改
sudo nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.addresses 10.0.3.1/30
sudo nmcli connection up "Wired connection 1"

# 或使用 ip 命令(临时)
sudo ip addr flush dev enp0s6np0
sudo ip addr add 10.0.3.1/30 dev enp0s6np0
sudo ip link set enp0s6np0 up

验证配置

ip addr show enp0s6np0
ip route | grep enp0s6np0

RDMA 测试

基础诊断

# 设备信息
ibstat
ibstatus
ibv_devinfo

# 链路信息
rdma dev show mlx5_0 -dd
rdma link show mlx5_0/1

# 查看 GID (用于 RoCE)
cat /sys/class/infiniband/mlx5_0/ports/1/gids/0

带宽测试

服务端(本机 10.0.3.1):

ib_write_bw -d mlx5_0

客户端(对端 10.0.3.2):

ib_write_bw -d mlx5_0 10.0.3.1

测试结果示例:

---------------------------------------------------------------------------------------
                    RDMA_Write BW Test
 Dual-port       : OFF		Device         : mlx5_0
 Number of qps   : 1		Transport type : IB
 Connection type : RC		Using SRQ      : OFF
 PCIe relax order: ON		Lock-free      : OFF
 ibv_wr* API     : ON
 TX depth        : 128
 CQ Moderation   : 1
 Mtu             : 1024[B]
 Link type       : Ethernet
 GID index       : 5
 Max inline data : 0[B]
 rdma_cm QPs	 : OFF
 Data ex. method : Ethernet
---------------------------------------------------------------------------------------
 local address: LID 0000 QPN 0x0088 PSN 0x39fdf1 RKey 0x184f00 VAddr 0x00ffff8e39d000
 GID: 00:00:00:00:00:00:00:00:00:00:255:255:10:00:03:01
 remote address: LID 0000 QPN 0x0087 PSN 0x24875a RKey 0x184e00 VAddr 0x00ffffa664d000
 GID: 00:00:00:00:00:00:00:00:00:00:255:255:10:00:03:01
---------------------------------------------------------------------------------------
 #bytes     #iterations    BW peak[MiB/sec]    BW average[MiB/sec]   MsgRate[Mpps]
 65536      5000             5946.61            5945.70		     0.095131

其他带宽测试命令:

# 读操作带宽测试
ib_read_bw -d mlx5_0          # 服务端
ib_read_bw -d mlx5_0 10.0.3.1 # 客户端

# 发送操作带宽测试
ib_send_bw -d mlx5_0          # 服务端
ib_send_bw -d mlx5_0 10.0.3.1 # 客户端

# 原子操作带宽测试
ib_atomic_bw -d mlx5_0          # 服务端
ib_atomic_bw -d mlx5_0 10.0.3.1 # 客户端

延迟测试

服务端(本机 10.0.3.1):

ib_write_lat -d mlx5_0

客户端(对端 10.0.3.2):

ib_write_lat -d mlx5_0 10.0.3.1

测试结果示例:

---------------------------------------------------------------------------------------
                    RDMA_Write Latency Test
 Dual-port       : OFF		Device         : mlx5_0
 Number of qps   : 1		Transport type : IB
 Connection type : RC		Using SRQ      : OFF
 PCIe relax order: OFF		Lock-free      : OFF
 ibv_wr* API     : ON
 TX depth        : 1
 Mtu             : 1024[B]
 Link type       : Ethernet
 GID index       : 5
 Max inline data : 220[B]
 rdma_cm QPs	 : OFF
 Data ex. method : Ethernet
---------------------------------------------------------------------------------------
 local address: LID 0000 QPN 0x008a PSN 0x8ddbc2 RKey 0x180ae8 VAddr 0x00aaaac935b000
 GID: 00:00:00:00:00:00:00:00:00:00:255:255:10:00:03:01
 remote address: LID 0000 QPN 0x0089 PSN 0xb11212 RKey 0x1807e5 VAddr 0x00aaaadb449000
 GID: 00:00:00:00:00:00:00:00:00:00:255:255:10:00:03:01
---------------------------------------------------------------------------------------
 #bytes #iterations    t_min[usec]    t_max[usec]  t_typical[usec]    t_avg[usec]
 2       1000          1.89           4.53         1.92      	       1.92

其他延迟测试命令:

ib_read_lat -d mlx5_0          # 服务端
ib_read_lat -d mlx5_0 10.0.3.1 # 客户端

ib_send_lat -d mlx5_0          # 服务端
ib_send_lat -d mlx5_0 10.0.3.1 # 客户端

ib_atomic_lat -d mlx5_0          # 服务端
ib_atomic_lat -d mlx5_0 10.0.3.1 # 客户端

高级选项

# 指定端口和队列深度
ib_write_bw -d mlx5_0 -p 18515 -q 16

# 指定消息大小
ib_write_bw -d mlx5_0 -s 1048576  # 1MB 消息

# 使用特定 GID 索引(RoCEv2)
ib_write_bw -d mlx5_0 -x 3 10.0.3.1

RoCE 配置

查看 RoCE 模式

通过 GID 表查看支持的 RoCE 版本:

# 查看 GID 0-3 的类型(RoCE v1 或 v2)
for i in 0 1 2 3; do
    echo -n "GID ${i} type: "
    cat /sys/class/infiniband/mlx5_0/ports/1/gid_attrs/types/${i}
done

# 查看 GID 对应的网络设备
for i in 0 1 2 3; do
    echo -n "GID ${i} ndev: "
    cat /sys/class/infiniband/mlx5_0/ports/1/gid_attrs/ndevs/${i}
done

# 查看 GID 值
cat /sys/class/infiniband/mlx5_0/ports/1/gids/0
cat /sys/class/infiniband/mlx5_0/ports/1/gids/3

示例输出:

GID 0 type: IB/RoCE v1
GID 1 type: RoCE v2
GID 2 type: IB/RoCE v1
GID 3 type: RoCE v2
GID 0 ndev: enp0s6np0
GID 1 ndev: enp0s6np0

选择 RoCE 版本

在测试工具中通过 -x 参数指定 GID 索引:

# 使用 GID 0 (RoCE v1)
ib_write_bw -d mlx5_0 -x 0

# 使用 GID 1 (RoCE v2)
ib_write_bw -d mlx5_0 -x 1

# 使用 GID 3 (RoCE v2,IPv6 格式)
ib_write_bw -d mlx5_0 -x 3

默认情况下,测试工具会自动选择合适的 GID。

故障排查

检查驱动加载

lsmod | grep mlx5
# 应显示 mlx5_core, mlx5_ib

cat /sys/class/infiniband/mlx5_0/node_type
# 应显示 "1: CA"

检查设备文件

ls -la /dev/infiniband/
# 应包含 uverbs0 (用户态 verbs 接口), umad0 (管理接口), rdma_cm 等

ls -la /sys/class/infiniband/mlx5_0/

检查网卡状态

# 驱动信息
ethtool -i enp0s6np0

# 链路状态
ethtool enp0s6np0 | grep -E "Speed|Duplex|Link"

# 统计信息
cat /sys/class/infiniband/mlx5_0/ports/1/counters/

网络连通性测试

# 测试对端连通性
ping 10.0.3.2

# 检查路由
ip route get 10.0.3.2

常见问题

  1. 端口状态不是 Active
    # 检查物理连接
    cat /sys/class/infiniband/mlx5_0/ports/1/phys_state
    # 应显示 "5: LinkUp"
    
  2. RoCE 连接失败
    # 检查 GID 配置
    cat /sys/class/infiniband/mlx5_0/ports/1/gids/0
    # 确保有有效的 IPv4/IPv6 GID
    
  3. 性能测试连接失败
    • 确认防火墙允许端口 18515(默认)
    • 检查对端是否已启动服务端
    • 验证 IP 地址和路由可达

开发参考

libibverbs 编程

#include <infiniband/verbs.h>

// 获取设备列表
struct ibv_device **dev_list;
int num_devices;
dev_list = ibv_get_device_list(&num_devices);

// 打开设备
struct ibv_context *ctx = ibv_open_device(dev_list[0]);

// 查询端口
struct ibv_port_attr port_attr;
ibv_query_port(ctx, 1, &port_attr);

// 清理
ibv_free_device_list(dev_list);

编译:gcc -o test test.c -libverbs

工具参考

工具 用途
ibstat 显示 InfiniBand 设备状态
ibstatus 显示端口状态摘要
ibv_devinfo 详细设备信息
rdma RDMA 子系统管理
ib_write_bw 写带宽测试
ib_read_bw 读带宽测试
ib_send_bw 发送带宽测试
ib_write_lat 写延迟测试
ib_read_lat 读延迟测试
ib_send_lat 发送延迟测试
ibnetdiscover 发现 IB 网络拓扑(仅 InfiniBand,RoCE 不可用)

实际测试性能

本地回环测试(同设备 QP 间):

写带宽 vs 消息大小

消息大小 平均带宽 消息速率
256 bytes 1160 MiB/sec 4.75 Mpps
1024 bytes 3641 MiB/sec 3.73 Mpps
4096 bytes 5693 MiB/sec 1.46 Mpps
65536 bytes 5942 MiB/sec 0.095 Mpps
1 MiB 5921 MiB/sec 0.006 Mpps

峰值带宽: ~5946 MiB/sec (~48 Gbps)

写延迟

消息大小 平均延迟 最小延迟 99% 分位
2 bytes 1.92 usec 1.89 usec 2.15 usec

测试结论

当前状态

项目 状态
驱动 (mlx5_core) [OK] 已加载
设备 (mlx5_0) [OK] 已识别
端口状态 [OK] Active / LinkUp
协议 [OK] RoCE
IP 地址 [OK] 10.0.3.1/30
对端连通性 [OK] 10.0.3.2 可达
带宽测试 [OK] ~48 Gbps (本地)
延迟测试 [OK] ~1.92 us (本地)

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。