IB 原生性能测试

145 阅读8分钟

环境信息


# 服务端

root@xcwa-4090-02:~# ip a | grep ib
71: ib0: <BROADCAST,MULTICAST> mtu 4092 qdisc noop state DOWN group default qlen 1000
    link/infiniband 00:00:01:68:fe:80:00:00:00:00:00:00:58:a2:e1:03:00:3e:26:e6 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp152s0
    altname ibs4
72: ib1: <BROADCAST,MULTICAST> mtu 4092 qdisc noop state DOWN group default qlen 1000
    link/infiniband 00:00:03:c0:fe:80:00:00:00:00:00:00:58:a2:e1:03:00:3e:20:e6 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp177s0
    altname ibs9
73: ib2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc mq state UP group default qlen 1000
    link/infiniband 00:00:07:6f:fe:80:00:00:00:00:00:00:b8:3f:d2:03:00:ac:98:7a brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp228s0
    altname ibs16
root@xcwa-4090-02:~#

# 客户端

root@xcwa-4090-03:~# ip a | grep ib
59: ib0: <BROADCAST,MULTICAST> mtu 4092 qdisc noop state DOWN group default qlen 1000
    link/infiniband 00:00:01:9e:fe:80:00:00:00:00:00:00:a0:88:c2:03:00:25:c3:b8 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp152s0
    altname ibs4
60: ib1: <BROADCAST,MULTICAST> mtu 4092 qdisc noop state DOWN group default qlen 1000
    link/infiniband 00:00:03:39:fe:80:00:00:00:00:00:00:b8:59:9f:03:00:ed:25:32 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp177s0
    altname ibs9
61: ib2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc mq state UP group default qlen 1000
    link/infiniband 00:00:04:ef:fe:80:00:00:00:00:00:00:e8:eb:d3:03:00:64:5c:ee brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
    altname ibp228s0
    altname ibs16
root@xcwa-4090-03:~#


# 我的环境如上,我需要直接测试 IB 原生协议带宽的工具的测试命令,不需要 IPoIB 的测试方法,务必精确,



InfiniBand/RoCE tools:

  • ib_send_bw
  • ib_send_lat
  • ib_write_bw
  • ib_write_lat
  • ib_read_bw
  • ib_read_lat
  • ib_atomic_bw
  • ib_atomic_lat

好的,我将为您提供 InfiniBand 原生协议(RDMA verbs)的带宽和延迟测试命令。这些工具来自 perftest 包。

测试环境确认

从您的输出可以看到:

  • 服务端: xcwa-4090-02 - ib2 接口 UP (GUID: b8:3f:d2:03:00:ac:98:7a)
  • 客户端: xcwa-4090-03 - ib2 接口 UP (GUID: e8:eb:d3:03:00:64:5c:ee)
  • 两端都使用 ib2 接口进行测试

🔥 核心测试命令

1️⃣ RDMA Write 带宽测试 (最常用)

服务端:

ib_write_bw -d mlx5_2 -i 1 -F --report_gbits

客户端:

ib_write_bw -d mlx5_2 -i 1 -F --report_gbits <服务端IP或IB地址>

2️⃣ RDMA Send 带宽测试

服务端:

ib_send_bw -d mlx5_2 -i 1 -F --report_gbits

客户端:

ib_send_bw -d mlx5_2 -i 1 -F --report_gbits <服务端IP或IB地址>

3️⃣ RDMA Read 带宽测试

服务端:

ib_read_bw -d mlx5_2 -i 1 -F --report_gbits

客户端:

ib_read_bw -d mlx5_2 -i 1 -F --report_gbits <服务端IP或IB地址>

4️⃣ RDMA Write 延迟测试

服务端:

ib_write_lat -d mlx5_2 -i 1 -F

客户端:

ib_write_lat -d mlx5_2 -i 1 -F <服务端IP或IB地址>

5️⃣ RDMA Send 延迟测试

服务端:

ib_send_lat -d mlx5_2 -i 1 -F

客户端:

ib_send_lat -d mlx5_2 -i 1 -F <服务端IP或IB地址>

🔍 如何确定设备名称 (-d 参数)

运行以下命令查看 IB 设备:

ibv_devices

输出示例:

device                 node GUID
------              ----------------
mlx5_0              58a2e103003e26e6
mlx5_1              58a2e103003e20e6
mlx5_2              b83fd20300ac987a  ← 这是 ib2 对应的设备

或者使用:

ibstat

📊 参数说明

参数说明
-d <device>指定 IB 设备名称 (如 mlx5_2)
-i <port>指定物理端口号 (通常是 1)
-F使用全部可用资源进行测试
--report_gbits以 Gbps 显示结果 (仅带宽测试)
-D <duration>测试持续时间(秒),默认 5 秒
-s <size>消息大小(字节),默认 65536
-n <iters>迭代次数,默认 1000 (延迟测试)

✅ 推荐的完整测试流程

# 1. 查看设备
ibv_devices

# 2. 查看端口状态
ibstat

# 3. 测试 RDMA Write 带宽 (最能反映实际性能)
# 服务端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits -D 10

# 客户端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits -D 10 <服务端IP>

# 4. 测试延迟
# 服务端
ib_write_lat -d mlx5_2 -i 1 -F -n 10000

# 客户端
ib_write_lat -d mlx5_2 -i 1 -F -n 10000 <服务端IP>

⚠️ 注意事项

  1. 如果没有配置 IP, 客户端可以直接使用 LID (Local Identifier):

    # 在服务端查看 LID
    ibstat mlx5_2 | grep "Base lid"
    
    # 客户端使用 LID 连接
    ib_write_bw -d mlx5_2 -i 1 -F --report_gbits <LID>
    
  2. 如果测试失败, 先检查:

    # 检查端口状态是否为 Active
    ibstat
    
    # 检查子网管理器是否运行
    ibstat | grep -i "state|sm"
    

这些命令测试的是纯 InfiniBand RDMA 协议,完全绕过 TCP/IP 栈,是测试 IB 原生性能的标准方法。

测试失败

IB 原生协议测试,需要指定 <服务端IP> 么? 而且我指定 Base lid: 112 也是失败的:

root@xcwa-4090-02:~# ibstat mlx5_2 | grep "Base lid" Base lid: 112

root@xcwa-4090-03:~# ib_write_bw -d mlx5_2 -i 1 -F --report_gbits b8:3f:d2:03:00:ac:98:7a Address family for hostname not supported for ai_family: 2 service: b8:3f:d2:03:00:ac:98:7a port: 18515 Problem in resolving basic address and port Unable to open file descriptor for socket connection Unable to init the socket connection

您说得对!我之前的说明有误。让我纠正:

❌ 问题分析

perftest 工具虽然测试的是 IB 原生 RDMA 协议,但控制平面(建立连接)仍需要 TCP/IP 来交换 QP 信息。因此:

  1. 不能直接使用 GUID (b8:3f:d2:03:00:ac:98:7a)
  2. 不能直接使用 LID (112)
  3. 必须使用 IP 地址或主机名

✅ 正确的解决方案

方案 1: 配置 IPoIB 地址(推荐)

虽然您不想测试 IPoIB 性能,但需要配置 IP 地址用于控制连接,数据传输仍然是纯 RDMA。

服务端 (xcwa-4090-02) :

ip link set ib2 up
ip addr add 192.168.100.2/24 dev ib2

客户端 (xcwa-4090-03) :

ip link set ib2 up
ip addr add 192.168.100.3/24 dev ib2

测试命令:

# 服务端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits

# 客户端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits 192.168.100.2

方案 2: 使用现有的以太网 IP

如果服务器之间已经有其他网络连接(如以太网),直接使用那个 IP 地址:

# 客户端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits <服务端的以太网IP>

重要: 虽然控制连接走以太网,但实际的 RDMA 数据传输仍然走 IB 链路,因为指定了 -d mlx5_2


方案 3: 使用 -R 参数(仅限双向测试)

如果两台机器在同一子网且有管理网络:

# 服务端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits -R

# 客户端
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits <管理网IP> -R

🔍 验证配置

配置 IPoIB 后验证:

# 检查接口状态
ip addr show ib2

# 测试连通性(控制平面)
ping -I ib2 192.168.100.3  # 从服务端 ping 客户端

# 查看 IB 状态(数据平面)
ibstat mlx5_2

📝 关键理解

控制平面 (TCP/IP)  →  交换 QP 信息、建立连接  →  需要 IP 地址
   ↓
数据平面 (RDMA)    →  实际数据传输            →  使用 IB 原生协议
  • perftest 工具设计: 使用 socket (TCP/IP) 来协商 RDMA 连接参数
  • 实际数据传输: 完全使用 RDMA verbs,不走 IP 栈
  • 您的 ib2 MTU 2044: 这是 IPoIB 的 MTU,不影响 RDMA 测试性能

✅ 推荐配置(最简单)

# 服务端
ip link set ib2 up
ip addr add 10.0.0.1/24 dev ib2

# 客户端  
ip link set ib2 up
ip addr add 10.0.0.2/24 dev ib2

# 服务端启动
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits

# 客户端连接
ib_write_bw -d mlx5_2 -i 1 -F --report_gbits 10.0.0.1

这样配置后,perftest 的控制连接走 IPoIB,但 RDMA 数据传输仍然是纯 IB 原生协议,不会影响测试结果。