第三部分 · 3 / 6
运行性能测试
一步步把 cmd 工具跑起来。重点说清一个最容易困惑的点:命令里那个 IP 到底是哪张网卡的地址。
1. 编译
产物落在 bin/:
go build -o bin/ ./cmd/...
2. 两节点运行
两节点都用网卡 mlx5_3 和 RoCE v2 GID 索引 3(-d mlx5_3 -x 3)。服务端先起,客户端再连:
# 服务端 —— 不带地址;监听在 mlx5_3 对应接口上
./bin/go_send_bw -s 65536 -n 5000 -d mlx5_3 -x 3
# 客户端 —— 地址填服务端 mlx5_3 网卡的 IP(不是管理口 IP)
./bin/go_send_bw -s 65536 -n 5000 -d mlx5_3 -x 3 10.0.0.1:18515
# 时延 + 完整直方图(客户端侧),同样拨向服务端 mlx5_3 的 IP
./bin/go_send_lat -d mlx5_3 -x 3 --output=histogram 10.0.0.1:18515
命令里的 IP 是哪张网卡的?
关键
命令里的
10.0.0.1 是服务端 -d 选中的那张 RoCE 网卡(mlx5_3,对应接口如 xgbe3)所绑定的 IP,
而不是管理口/普通以太网口的 IP。客户端必须拨向它,才能保证两端走在同一张物理 RDMA 网络上。
为什么强调这点?RDMA 主机通常有多张网卡:一张管理口(跑 SSH 等普通流量)+ 若干张 RoCE 网卡(CPU 网、GPU 网)。
SSH 进去时你用的 IP 往往是管理口,但 RDMA 流量必须走 -d 指定的那张 RoCE 网卡。两者 IP 不同:
| 接口 | 设备 | 用途 | 这里要填的 IP |
|---|---|---|---|
| 管理口 (eth0) | — | SSH / 普通流量 | ❌ 不是它 |
| xgbe0 | mlx5_0 | CPU RoCE 网 | 用 -d mlx5_0 时填它 |
| xgbe3 | mlx5_3 | GPU RoCE 网 | ✅ 本例 -d mlx5_3 填它 |
确认网卡↔IP 的对应关系:
# 看接口和它们的 IP
ip addr
# 看 RDMA 设备和接口的映射(哪张 mlx5_x 对应哪个网口)
ibdev2netdev
# 例:mlx5_3 port 1 ==> xgbe3 (Up),再用 ip addr 查 xgbe3 的 IP
3. 读结果
- 带宽工具:客户端打印吞吐(Gb/s);服务端打印
server done。 - 时延工具:打印往返时延统计;加
--output=histogram出完整分布。
高层 go_rdmanet_bw 提速:--batch
go_rdmanet_bw 默认 SendMsg 逐条发,只有一条消息在飞,吞吐受单条往返延迟限制。
加 --batch N(简写 -b N)让它用 SendBatch/RecvBatch 保持 N 条在飞,
接近 perftest 的流水线吞吐;再配 --poll busy 去掉事件唤醒延迟:
# 服务端(两端 -b 要一致)
./bin/go_rdmanet_bw -d mlx5_1 -x 3 -b 32
# 客户端:批量 + 忙轮询,吞吐远高于默认逐条发送
./bin/go_rdmanet_bw -s 65536 -n 1000000 -d mlx5_1 -x 3 -b 32 --poll busy 33.0.226.25:18515
输出会带模式标签,便于对比,例如
SendBatch(32): sent 1000000 x 65536 bytes in ...: XX Gb/s, Y.YYY Mpps。
即便如此它通常仍略低于 go_send_bw——见 cmd 性能工具 末尾对两层 API 取舍的说明。
连不上排查清单
- 两端
-d/-x是否都选到对应同一张物理网络、且支持 RoCE v2? - 客户端地址是否填了服务端该设备所在接口的 IP(不是管理口)?
- 用 TCP 握手时(默认),握手端口(
-p/ 默认 18515)是否互通、没被防火墙挡? - 端口状态是否 ACTIVE(
ibstat查看)?
下一步
工具讲完了,接下来转向更适合「照着抄」的 examples 示例。
gordma 教程