Red Hat 8.5安装libfabric
Red Hat 8.5安装libfabric 分为搭建环境、编写/准备代码、运行测试三步。
🛠️ 第一步:开发环境搭建 (Red Hat 8.5)
在 Red Hat 8.5 上搭建环境,主要有两种方式:一种是使用包管理器快速安装,另一种是从源码编译以获得最新版本和更多灵活性。对于性能对比测试,推荐源码编译,以便更好地控制 provider。
方式一:
如果你需要特定版本或希望精细控制编译选项(如强制启用 verbs provider),源码编译是更好的选择。
-
安装基础依赖和 RDMA 驱动
# 安装编译工具和依赖库 sudo yum install -e git gcc make autoconf libtool # 安装 RDMA 核心库 (verbs provider 依赖) sudo yum install -e libibverbs librdmacm -
下载并编译安装 libfabric
# 1. 从 GitHub 获取最新源码 (以 v1.17.0 为例,你可以选用其他版本) wget https://github.com/ofiwg/libfabric/releases/download/v1.17.0/libfabric-1.17.0.tar.bz2 tar -xf libfabric-1.17.0.tar.bz2 cd libfabric-1.17.0 # 2. 配置编译选项。关键是指定安装路径,并确保 verbs 和 tcp provider 被启用 ./configure --prefix=/usr/local/libfabric --enable-verbs=yes --enable-tcp=yes # 3. 编译并安装 make -j $(nproc) sudo make install -
安装perftest
# fabtests 通常与 libfabric 在同一压缩包中 cd ../fabtests-1.17.0 # 配置,并指定 libfabric 的安装路径 ./configure --prefix=/usr/local/fabtests --with-libfabric=/usr/local/libfabric make -j $(nproc) sudo make install -
配置运行时环境
为了让系统找到我们新安装的库和工具,需要设置环境变量:# 添加到你的 ~/.bashrc 文件中,使其永久生效 export LD_LIBRARY_PATH=/usr/local/libfabric/lib:$LD_LIBRARY_PATH export PATH=/usr/local/libfabric/bin:$PATH -
验证安装
运行fi_info命令来查看系统识别的 providers 和网络接口。# 查看所有 providers fi_info # 专门查看 verbs provider 是否正常 (应列出你的 RDMA 网卡) fi_info -p verbs # 查看 tcp provider 信息 fi_info -p tcp如果
fi_info -p verbs能正确显示你的 InfiniBand 或 RoCE 网卡(如mlx5_0),说明 RDMA 环境已就绪。
💻 第二步:编程
对于性能对比测试,最有效的方法通常是直接利用官方测试套件 fabtests 中提供的工具 。这些工具已经实现了核心的数据通路,并支持通过参数切换 provider,可以直接用于对比,省去了从头编写的繁琐过程。
-
主要测试程序:
fi_pingpong: 用于测试延迟,消息在客户端和服务端之间往返 。fi_rma_bw/fi_msg_bw: 用于测试带宽,通常是一端发送,另一端接收 。
-
核心编程思想 (如果你仍需要自行开发):
如果你的测试场景非常特殊,需要自行编写代码,其核心逻辑与我们上一轮讨论的一致,依然是:- 初始化:使用
fi_getinfo()查询并选择provider(verbs 或 tcp)。 - 资源创建:打开
fabric和domain,创建endpoint和完成队列 (CQ)。 - 连接/地址交换:对于
FI_EP_MSG端点需要连接;对于FI_EP_RDM,则需要交换地址。 - 数据传输:在关键路径上调用
fi_send/fi_recv(用于消息) 或fi_write/fi_read(用于 RMA)。 - 完成事件处理:轮询 CQ 以获取操作完成状态。
- 初始化:使用
🚀 第三步:测试运行
这里我们以 fi_pingpong (延迟) 和 fi_rma_bw (带宽) 为例,演示如何在 Red Hat 8.5 上进行 TCP 和 RDMA 的对比测试。你需要准备两台配置好网络的服务器,一台作为服务端,一台作为客户端。
延迟对比测试 (fi_pingpong)
fi_pingpong -p tcp -e msg
fi_pingpong -p tcp -e msg 192.168.0.233
bytes #sent #ack total time MB/sec usec/xfer Mxfers/sec
64 10 =10 1.2k 0.00s 5.90 10.85 0.09
256 10 =10 5k 0.00s 20.56 12.45 0.08
1k 10 =10 20k 0.00s 102.91 9.95 0.10
4k 10 =10 80k 0.00s 290.50 14.10 0.07
64k 10 =10 1.2m 0.00s 1584.91 41.35 0.02
1m 10 =10 20m 0.01s 1414.70 741.20 0.00
[root@mofed-test-cx5-bond-pod1-dh2-0 libfabric-2.4.0]# fi_pingpong -p verbs -e msg -d zrdma1 10.56.60.11
bytes #sent #ack total time MB/sec usec/xfer Mxfers/sec
64 10 =10 1.2k 0.00s 10.41 6.15 0.16
256 10 =10 5k 0.00s 38.21 6.70 0.15
1k 10 =10 20k 0.00s 150.59 6.80 0.15
4k 10 =10 80k 0.00s 312.67 13.10 0.08
64k 10 =10 1.2m 0.00s 3236.35 20.25 0.05
1m 10 =10 20m 0.01s 2932.26 357.60 0.00
| 协议 | 角色 | 命令示例 | 说明 |
|---|---|---|---|
| TCP | 服务端 | fi_pingpong -p tcp |
-p tcp 指定使用 TCP provider。 |
| 客户端 | fi_pingpong -p tcp <服务端IP> |
连接服务端进行 ping-pong 测试。 | |
| RDMA | 服务端 | fi_pingpong -p verbs -d mlx5_0 |
-p verbs 指定使用 RDMA provider;-d 指定具体的 RDMA 设备名 (通过 fi_info -p verbs 查看)。 |
| 客户端 | fi_pingpong -p verbs -d mlx5_0 <服务端IP> |
客户端同样指定 provider 和设备,并连接服务端。 |
带宽对比测试 (fi_rma_bw)
| 协议 | 角色 | 命令示例 | 说明 |
|---|---|---|---|
| TCP | 服务端 | fi_rma_bw -p tcp |
使用 TCP provider 监听。 |
| 客户端 | fi_rma_bw -p tcp <服务端IP> |
客户端连接并开始带宽测试。 | |
| RDMA | 服务端 | fi_rma_bw -p verbs -d mlx5_0 |
使用 RDMA verbs provider 。 |
| 客户端 | fi_rma_bw -p verbs -d mlx5_0 <服务端IP> |
客户端连接并开始 RDMA 带宽测试。 |
测试中的关键参数
在进行上述测试时,可以附加一些通用参数来使测试更全面:
-S <size>:设置消息大小。测试不同消息大小(如 64, 256, 1024, 4096, 65536 字节)下的性能,是分析性能拐点的关键 。-I <iterations>:指定迭代次数。增加迭代次数(如 1000 或 10000)可以获得更稳定的平均值 。
原理
直接使用 RDMA 原生 API (如 ibverbs) 还是 使用 libfabric API。
核心结论:
如果你使用 libfabric 编写代码(推荐方案):不需要,也不应该直接控制 QP (Queue Pair) 和 CQ (Completion Queue)。
原因:libfabric 的设计初衷就是抽象底层硬件细节。它通过 fi_endpoint (EP) 抽象了 QP,通过 fi_cq (Completion Queue) 抽象了 CQ。你只需要调用 libfabric 的通用 API(如 fi_send, fi_recv, fi_cq_read)。
底层行为:
当你选择 provider 为 verbs (RDMA) 时,libfabric 内部会自动创建 QP、配置 CQ、处理内存注册 (Memory Registration) 和地址映射。
当你选择 provider 为 tcp 时,libfabric 内部会自动创建 Socket、设置缓冲区。
优势:
这正是你能用同一套代码对比 RDMA 和 TCP 性能的前提。如果你手动管理 QP/CQ,代码将耦合到 RDMA 硬件,无法直接运行在 TCP 上,也就失去了“统一接口对比”的意义。

浙公网安备 33010602011771号