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和驱动固件共同作用下的极限能力。这为后续分层排查提供了干净的基线。

选型提示:如果业务主要是存储同步(如NVMe-oF),优先关注ib_write_bw结果;如果业务是分布式数据库缓存读取(如Redis over RDMA),则ib_read_bw和ib_read_lat更具参考意义。两者都测,才能全面评估链路双向健康度。
RDMA带宽/延迟测试原理与数据流 客户端 (initiator) HCA Port 1 GID: fe80::1 服务端 (target) HCA Port 1 GID: fe80::2 IB 交换机 链路速率: NDR 400Gb/s ib_write_bw: 客户端→服务端 数据推送 ib_read_bw: 客户端←服务端 数据拉取 延迟测试 (ib_write_lat / ib_read_lat) 小消息(如2字节) → 记录单次操作耗时 → 典型值: 0.5~2 µs (取决于链路与HCA) 注意:延迟测试需关闭流量控制并固定CPU频率,避免噪声干扰 ① Write: 客户端主动推送 ② Read: 客户端主动拉取

4.2 方法流程:从环境准备到结果判读的标准步骤

基准测试看似简单(一条命令),但结果的可信度高度依赖测试方法的严谨性。以下是经过验证的标准流程:

4.2.1 环境准备(测试前必做)

  1. 确认驱动与固件版本一致:两端HCA的mlx4_core/mlx5_core驱动版本应相同,ibstat或ibv_devinfo检查固件版本。
  2. 检查链路状态:使用ibstatus确认端口处于Active状态,链路速率应为预期值(如400 Gb/s (NDR))。
  3. CPU亲和性绑定:将测试进程绑定到HCA所在的NUMA节点核心,避免跨NUMA访问导致性能下降。使用numactl --cpunodebind=0 --membind=0。
  4. 关闭影响测试的系统服务:如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链路问题。

定位过程:

  1. 初步检查:ibstatus显示两端链路均为Active,速率400Gb/s,物理层正常。
  2. 执行带宽测试:使用ib_write_bw -s 8388608(8MB大消息)测试,结果仅210 Gb/s,约为理论值的一半。
  3. 缩小范围:将测试两端迁移到同一交换机下的不同端口,性能恢复至390Gb/s;再迁移回原端口,性能再次下降。由此判断问题不在HCA,而在交换机端口或线缆。
  4. 深入排查:检查交换机端口统计,发现大量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 误区/复盘:基准测试中常见的“假阳性”与“假阴性”

即使工具使用正确,测试结果仍可能误导判断。以下是高频误区:

误区一:忽略CPU频率缩放。现代CPU的节能模式会在低负载时降低频率。延迟测试使用小消息,CPU占用率低,可能运行在1.2GHz而非标称的3.0GHz,导致延迟虚高。解决:测试前设置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流程,实现周期性自动巡检,在用户感知到性能下降之前主动发现隐患。