环境信息
# 服务端
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>
⚠️ 注意事项
-
如果没有配置 IP, 客户端可以直接使用 LID (Local Identifier):
# 在服务端查看 LID ibstat mlx5_2 | grep "Base lid" # 客户端使用 LID 连接 ib_write_bw -d mlx5_2 -i 1 -F --report_gbits <LID> -
如果测试失败, 先检查:
# 检查端口状态是否为 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 信息。因此:
- 不能直接使用 GUID (b8:3f:d2:03:00:ac:98:7a)
- 不能直接使用 LID (112)
- 必须使用 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 原生协议,不会影响测试结果。