Red Hat 8.5安装libfabric

Red Hat 8.5安装libfabric 分为搭建环境、编写/准备代码、运行测试三步。

🛠️ 第一步:开发环境搭建 (Red Hat 8.5)

在 Red Hat 8.5 上搭建环境,主要有两种方式:一种是使用包管理器快速安装,另一种是从源码编译以获得最新版本和更多灵活性。对于性能对比测试,推荐源码编译,以便更好地控制 provider

方式一:

如果你需要特定版本或希望精细控制编译选项(如强制启用 verbs provider),源码编译是更好的选择。

  1. 安装基础依赖和 RDMA 驱动

    # 安装编译工具和依赖库
    sudo yum install -e git gcc make autoconf libtool
    # 安装 RDMA 核心库 (verbs provider 依赖)
    sudo yum install -e libibverbs librdmacm
    
  2. 下载并编译安装 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
    
  3. 安装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
    
  4. 配置运行时环境
    为了让系统找到我们新安装的库和工具,需要设置环境变量:

    # 添加到你的 ~/.bashrc 文件中,使其永久生效
    export LD_LIBRARY_PATH=/usr/local/libfabric/lib:$LD_LIBRARY_PATH
    export PATH=/usr/local/libfabric/bin:$PATH
    
  5. 验证安装
    运行 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: 用于测试带宽,通常是一端发送,另一端接收 。
  • 核心编程思想 (如果你仍需要自行开发)
    如果你的测试场景非常特殊,需要自行编写代码,其核心逻辑与我们上一轮讨论的一致,依然是:

    1. 初始化:使用 fi_getinfo() 查询并选择 provider (verbs 或 tcp)。
    2. 资源创建:打开 fabricdomain,创建 endpoint 和完成队列 (CQ)。
    3. 连接/地址交换:对于 FI_EP_MSG 端点需要连接;对于 FI_EP_RDM,则需要交换地址。
    4. 数据传输:在关键路径上调用 fi_send/fi_recv (用于消息) 或 fi_write/fi_read (用于 RMA)。
    5. 完成事件处理:轮询 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 上,也就失去了“统一接口对比”的意义。

posted @ 2026-03-07 15:59  静水深耕,云停风驻  阅读(0)  评论(0)    收藏  举报