本文目录导读:

使用 qperf 测试 RDMA 性能是一个非常标准且高效的方法。qperf 可以测量点对点(通常是两台机器之间)的带宽和延迟,并且专门支持 RDMA 协议(如 InfiniBand 或 RoCE)。
以下是详细的使用步骤和测试方法:
准备工作
-
安装 qperf: 在两台机器(通常称为 Server 和 Client)上都安装。
- RHEL/CentOS/Fedora:
sudo yum install qperf -y
- Ubuntu/Debian:
sudo apt-get update sudo apt-get install qperf -y
- 编译安装(可选): 如果需要最新版本,可以从 GitHub (linux-rdma/qperf) 下载源码编译。
- RHEL/CentOS/Fedora:
-
确认 RDMA 设备正常: 在启动测试前,确保两台机器都能看到 RDMA 设备,并且链路状态正常(以 InfiniBand 为例):
# 查看 IB 设备状态 ibstat # 或查看 RoCE / 通用 RDMA 设备 ibv_devinfo
确保
state:为ACTIVE,physical state:为LinkUp。 -
防火墙设置:
qperf默认使用 TCP 端口19765和 UDP 端口19766进行控制连接(用于协商参数),如果开启了防火墙,需要放行这两个端口,或者先关闭防火墙(仅限测试环境)。# 临时关闭防火墙(测试后记得打开) sudo systemctl stop firewalld # 或者直接放行端口 (推荐) sudo firewall-cmd --add-port=19765/tcp --add-port=19766/udp --permanent sudo firewall-cmd --reload
测试方法
测试时,通常先在一台机器上启动监听模式(Server),然后在另一台机器上发起连接(Client)。
基础带宽测试 (Streaming)
这是最常用的测试,用来测量在建立连接后,数据的最大传输速率(不关心单个消息的确认时间)。
-
步骤 1:在 Server 端启动监听
# 监听所有地址的默认端口 qperf
或者指定监听特定 IP(RDMA 接口 IP):
# 10.0.0.1 是 RDMA 网卡的 IP qperf -lp <端口号> -ip <IP地址> # 默认端口是 19765,通常不需要更改,直接运行 qperf 即可
-
步骤 2:在 Client 端发起测试
# 格式: qperf <Server_IP> <测试项> # 测试 TCP 带宽 (不是 RDMA,用于对比) qperf 10.0.0.1 tcp_bw # 测试 RDMA 内部协议的带宽 (通常这才是你想要的) # rc:可靠连接 (RC, Reliable Connection,最常用) # uc:不可靠连接 (UC, Unreliable Connection) # ud:不可靠数据报 (UD, Unreliable Datagram) qperf 10.0.0.1 rc_bw qperf 10.0.0.1 uc_bw qperf 10.0.0.1 ud_bw
常用选项(在 Client 端使用):
-m <消息大小>:指定消息大小(字节),-m 64K,不同的消息大小会影响带宽(通常大消息接近线速)。-t <时间>:测试持续时间(秒),默认通常是 2-5 秒。-oo <选项>:设置具体参数。-oo msg_size:1M或-oo qp_inline等。
完整示例:
# 用 1MB 的消息大小测试 RC 带宽,持续 10 秒 qperf 10.0.0.1 -m 1M -t 10 rc_bw
输出示例:
rc_bw: bw = 11258 MB/sec (带宽) msg_rate = 11.25 K/sec (消息速率) msg_size = 1 MiB (消息大小) ...
延迟测试 (Latency)
测量一个数据包从 Client 发到 Server,再返回 Client 的往返时间(RTT,Round-Trip Time)。
-
Server 端: 同样只需要启动
qperf(可以复用上面的进程,或重新开一个)。 -
Client 端:
# 测试 RDMA RC 延迟 (这里消息大小通常很小,如 1 字节或 64 字节) qperf 10.0.0.1 rc_lat qperf 10.0.0.1 ud_lat
常用选项:
-m <字节大小>:指定用于延迟测试的消息大小(1 到 64 字节比较有意义)。-oo <选项>:-oo use_rdma_cm=false可能会改变延迟结果。
示例:
# 测试 64 字节消息的 RC 延迟 qperf 10.0.0.1 -m 64 -t 5 rc_lat
输出示例:
rc_lat: latency = 1.19 us (单位通常是微秒) ...
双向带宽测试 (Bidirectional)
如果想知道同时收发数据时的总带宽:
qperf 10.0.0.1 -oo msg_size:1M rc_bw rc_bw
两个 rc_bw 表示客户端发送 + 服务端发送(或者客户端收+发),结果通常会显示双向总带宽。
RDMA 测试与 TCP 测试的对比
为了确认 RDMA 的优势,可以对比测试 TCP 性能(即使 RDMA 卡已启用,系统通常也可以通过 IP over IB 或 TCP over RDMA 走 TCP 路径):
# 在 Client 端 qperf 10.0.0.1 tcp_bw # TCP 带宽 qperf 10.0.0.1 tcp_lat # TCP 延迟
RDMA 的 rc_bw 和 tcp_bw 结果差别不大,可能意味着:
- 应用程序被绑定了 CPU: 使用
taskset或 numactl绑定 CPU 和网卡所在的同一 NUMA 节点。 - 存在网络瓶颈: 链路速度未达到预期(如 100Gb 卡只跑了 40Gb)。
- 驱动或固件问题。
高级调试技巧
-
绑定 CPU 和 NUMA 节点: 为了获得最佳性能,确保
qperf进程运行在 RDMA 网卡所在的 NUMA 节点上,先查看网卡所在节点:# 查看网卡所在 NUMA 节点 cat /sys/class/infiniband/<设备名>/device/numa_node
然后启动
qperf(Client 和 Server):# 假设 NUMA 节点为 1 numactl --cpunodebind=1 --membind=1 qperf <Server_IP> -m 1M rc_bw
-
调整消息大小: 如果你想模拟实际应用(比如存储),可以测试不同消息大小:
# 4K 消息大小 (类似小文件 IO) qperf 10.0.0.1 -m 4K rc_bw # 256K 消息大小 (流式 IO) qperf 10.0.0.1 -m 256K rc_bw # 1M 消息大小 (大块传输) qperf 10.0.0.1 -m 1M rc_bw
-
一次测试多项:
qperf 10.0.0.1 -m 64 rc_lat -m 1M rc_bw
-
指定接口: 如果主机有多张 RDMA 卡,你可能需要显式指定使用哪个 RDMA 接口,这可以通过
-ip和-lp完成,但更好的方式是指定绑定到哪个 GID(Global Identifier):# 查看 GID 索引 show_gids # 或者使用 ibdev2netdev 查看对应关系 # 在 qperf 中,使用 -ip 参数绑定 IP 地址即可对应到具体网卡
总结测试流程 (速查)
- Server (机器A):运行
qperf - Client (机器B):运行
qperf <机器A的RDMA IP> rc_bw(看带宽) - Client (机器B):运行
qperf <机器A的RDMA IP> rc_lat(看延迟) - 对比:运行
qperf <机器A的RDMA IP> tcp_bw(看 TCP 性能,如果接近 RC,说明 RDMA 没有生效或配置不对)
这样你就可以快速评估 RDMA 网络的性能了,如果遇到问题,检查 dmesg | grep infiniband 或 ibdev2netdev 来确认 RDMA 设备状态。
标签: qperf使用