4、性能基准测试:使用 ib_write_bw、ib_read_bw 等工具进行带宽和延迟测试
4.1 核心原理:为什么基准测试是性能定位的“标尺”
在IB网络性能问题定位中,基准测试不是可选项,而是必选项。它的核心价值在于:将“感觉慢”转化为“可量化的偏差”。当用户抱怨应用性能差时,我们需要先回答一个基础问题:底层IB链路本身能跑多快?如果链路实测带宽只有理论值的60%,那么应用层再优化也无法突破这个瓶颈;反之,如果链路带宽达到理论值的95%以上,问题焦点就应该转向应用层或协议栈。
perftest工具包中的ib_write_bw和ib_read_bw是业界标准的带宽测试工具,其原理基于RDMA操作语义:
- ib_write_bw:模拟RDMA Write操作,发送方(客户端)主动将数据写入接收方(服务端)的预先注册内存区域,不需要接收方CPU参与数据拷贝,测试的是单向写带宽。
- ib_read_bw:模拟RDMA Read操作,客户端主动从服务端内存中读取数据,测试的是单向读带宽。
- ib_write_lat / ib_read_lat:对应测试单次操作的往返延迟(Round Trip Time),通常以微秒(µs)为单位。
理解这些工具的关键在于:它们绕过了内核网络栈和文件系统,直接通过IB Verbs接口操作HCA(Host Channel Adapter),因此测出的是“裸金属”性能——即物理链路、交换机、HCA和驱动固件共同作用下的极限能力。这为后续分层排查提供了干净的基线。
ib_write_bw结果;如果业务是分布式数据库缓存读取(如Redis over RDMA),则ib_read_bw和ib_read_lat更具参考意义。两者都测,才能全面评估链路双向健康度。
4.2 方法流程:从环境准备到结果判读的标准步骤
基准测试看似简单(一条命令),但结果的可信度高度依赖测试方法的严谨性。以下是经过验证的标准流程:
4.2.1 环境准备(测试前必做)
- 确认驱动与固件版本一致:两端HCA的
mlx4_core/mlx5_core驱动版本应相同,ibstat或ibv_devinfo检查固件版本。 - 检查链路状态:使用
ibstatus确认端口处于Active状态,链路速率应为预期值(如400 Gb/s (NDR))。 - CPU亲和性绑定:将测试进程绑定到HCA所在的NUMA节点核心,避免跨NUMA访问导致性能下降。使用
numactl --cpunodebind=0 --membind=0。 - 关闭影响测试的系统服务:如
irqbalance、NetworkManager(如果使用IPoIB)、防火墙等。
4.2.2 执行测试命令
首先在服务端启动监听进程:
# 服务端(target)— 监听默认端口18515
ib_write_bw -d mlx5_0 -x 3 --report_gbits
# 参数说明:
# -d 指定IB设备
# -x 指定GID索引(3通常对应RoCE v2)
# --report_gbits 以Gbit/s为单位输出
然后在客户端发起测试:
# 客户端(initiator)— 连接服务端IP
ib_write_bw -d mlx5_0 -x 3 --report_gbits 192.168.1.10
# 测试不同消息大小的带宽(从2字节到1MB)
ib_write_bw -d mlx5_0 -x 3 --report_gbits -s 65536 192.168.1.10
# 延迟测试(使用ib_write_lat)
ib_write_lat -d mlx5_0 -x 3 192.168.1.10
Connection timed out错误。正确顺序是:先服务端,后客户端。另外,两端必须使用相同的-x GID索引,否则RoCE v2模式下可能无法通信。
4.2.3 结果判读与记录
测试完成后,工具会输出类似如下的汇总表:
---------------------------------------------------------------------------------------
RDMA_Write BW Test
Dual-port : OFF Device : mlx5_0
Number of qps : 1 Transport type : IB
Connection type : RC Using SRQ : OFF
CQ Moderation : 100
Mtu : 4096[B] Link type : Ethernet
Max inline data : 0[B]
rdma_cm QPs : OFF Data ex. method : Ethernet
---------------------------------------------------------------------------------------
#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]
65536 5000 392.1 391.5 0.747
---------------------------------------------------------------------------------------
关键判读指标:
- BW peak vs BW average:两者差距应小于1%,若差距大说明链路不稳定。
- 对比理论值:NDR 400Gb/s链路,实测应达到370~390 Gb/s(考虑到编码开销和协议头),低于350 Gb/s则需排查。
- MsgRate:对于小消息(如4KB以下),关注每秒百万消息数(Mpps),这反映HCA的处理能力。
4.3 案例/场景:一次真实的“带宽减半”故障定位
场景描述:某超算中心反馈,两个计算节点间的MPI_Allreduce操作耗时比平时增加了2倍。运维人员初步怀疑是IB链路问题。
定位过程:
- 初步检查:
ibstatus显示两端链路均为Active,速率400Gb/s,物理层正常。 - 执行带宽测试:使用
ib_write_bw -s 8388608(8MB大消息)测试,结果仅210 Gb/s,约为理论值的一半。 - 缩小范围:将测试两端迁移到同一交换机下的不同端口,性能恢复至390Gb/s;再迁移回原端口,性能再次下降。由此判断问题不在HCA,而在交换机端口或线缆。
- 深入排查:检查交换机端口统计,发现大量
Link Degraded计数和CRC错误。更换光模块后,带宽恢复正常。
关键启示:如果直接检查物理层,可能只会看到“链路UP”的表面现象,而ib_write_bw通过实际数据搬运,暴露了物理层无法感知的信号完整性劣化问题。这就是基准测试作为“探针”的价值。
| 测试项 | 命令示例 | 预期健康值 | 异常阈值 |
|---|---|---|---|
| 写带宽 (大消息) | ib_write_bw -s 1048576 |
≥ 理论值95% | < 理论值85% |
| 读带宽 (大消息) | ib_read_bw -s 1048576 |
≥ 理论值95% | < 理论值85% |
| 写延迟 (小消息) | ib_write_lat -s 2 |
≤ 2 µs | > 5 µs |
| 读延迟 (小消息) | ib_read_lat -s 2 |
≤ 2 µs | > 5 µs |
| 双向带宽 | ib_write_bw --bidirectional |
≥ 理论值90% | < 理论值80% |
4.4 误区/复盘:基准测试中常见的“假阳性”与“假阴性”
即使工具使用正确,测试结果仍可能误导判断。以下是高频误区:
cpupower frequency-set -g performance。
误区二:使用默认消息大小。
ib_write_bw默认消息大小为65536字节(64KB),这只能反映大块数据传输能力。如果业务以小消息(如8字节)为主,必须显式指定-s 8测试,否则会漏掉小消息处理瓶颈。
误区三:单QP测试掩盖多流问题。默认测试使用1个QP(Queue Pair),但实际应用可能开启多个QP。当多个QP并发时,HCA的调度和交换机缓冲可能成为瓶颈。建议使用
-q 4或-q 8增加QP数量测试。
误区四:忽略PCIe瓶颈。HCA通过PCIe连接到CPU,如果PCIe链路降速(如从Gen5 x16降为Gen4 x16),即使IB链路正常,带宽也会受限。测试时观察
ibstat中的PCIe link rate字段,并使用lspci -vvv确认PCIe带宽。
复盘建议:每次基准测试后,应保存完整的测试日志(包括命令参数、两端设备信息、CPU频率、PCIe状态),形成可追溯的基线档案。当后续出现性能波动时,用同一套参数重新测试,对比差异即可快速定位是环境变化还是硬件劣化。建议将测试脚本固化,纳入CI/CD流程,实现周期性自动巡检,在用户感知到性能下降之前主动发现隐患。