Debug Soft-RoCE (RXE) 完整流程

一、环境准备

1.1 系统要求

推荐使用 Ubuntu 22.04 LTS ,内核版本 5.15 或更高(Soft-RoCE 驱动自 Linux 4.8 起已合入内核)。普通以太网卡即可,无需专用 RDMA 硬件。建议内存至少 4GB。

bash 复制代码
# 确认系统与内核版本
lsb_release -a
uname -r

1.2 安装编译依赖

从源码编译 rdma-core(Soft-RoCE 用户态库和工具的主要来源)需要以下依赖:

bash 复制代码
sudo apt-get update
sudo apt-get install -y \
    build-essential git cmake ninja-build pkg-config \
    gcc g++ make autoconf automake libtool \
    libnl-3-dev libnl-route-3-dev libudev-dev \
    valgrind python3-dev cython3 python3-docutils pandoc \
    libibverbs-dev librdmacm-dev ibverbs-utils rdmacm-utils \
    ibacm infiniband-diags perftest

各关键依赖的作用:libnl-3-dev 和 libnl-route-3-dev 用于网络接口管理,ninja-build 是推荐的构建后端,valgrind 支持内存调试注解,perftest 提供性能测试工具(如 ibv_rc_pingpong)。

1.3 克隆 rdma-core 源码

bash 复制代码
git clone https://github.com/linux-rdma/rdma-core.git
cd rdma-core

建议检查可用的发布版本标签:

bash 复制代码
git tag -l | tail -10
# 如需切换到特定稳定版本(例如 v50.0):
# git checkout v50.0

二、Release 版源码编译安装

Release 构建会启用优化(-O2)并定义 NDEBUG,适合生产环境和性能测试,但会剥离大量调试信息。

2.1 标准 Release 构建流程

rdma-core 使用 CMake 构建系统。其 buildlib/RDMA_BuildType.cmake 将默认构建类型设为 RelWithDebInfo(带调试信息的优化构建),而 Release 是专为打包者保留的类型 ,语义上与默认的 RelWithDebInfo 相同,使用 -O2 -DNDEBUG。

从源码构建 Release 版并安装到系统:

bash 复制代码
cd rdma-core

# 创建独立构建目录(保持源码树干净)
mkdir -p build-release && cd build-release

# 配置:指定 Release 构建类型,安装前缀为 /usr
cmake -G Ninja \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/usr \
    ..

# 编译(使用 ninja 并行构建)
ninja

# 安装到系统
sudo ninja install

-DCMAKE_INSTALL_PREFIX=/usr 确保库文件安装到 /usr/lib/x86_64-linux-gnu/,头文件到 /usr/include/,可执行工具到 /usr/bin/,与系统包管理器安装的路径一致,避免库搜索路径冲突。

2.2 使用 build.sh 脚本简化构建

rdma-core 提供了 build.sh 脚本封装 CMake 流程。它会在当前目录创建 build/ 子目录,编译产物位于 build/bin/ 和 build/lib/ 中:

bash 复制代码
cd rdma-core
bash build.sh
# 产物路径:
#   build/bin/   -- 可执行工具(如 ibv_devinfo, ibv_rc_pingpong)
#   build/lib/   -- 共享库

注意 :build.sh 默认使用 RelWithDebInfo 构建类型。如需强制 Release,需通过环境变量传入额外 CMake 标志(见下一节)。默认情况下 build.sh 不自动安装到系统,适合在构建目录中直接运行工具进行快速验证。

三、Debug 版源码编译安装

Debug 构建的主要目的是保留完整的调试符号、关闭优化,并启用额外的调试代码路径,以便使用 GDB 跟踪 rdma-core 的用户态实现,或通过日志观察 RXE 驱动的行为。

3.1 Debug 构建的 CMake 配置

在 rdma-core 的构建系统中,当 CMAKE_BUILD_TYPE 设置为 Debug 时,会触发以下行为:

cmake 复制代码
if (CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
    add_definitions("-DVERBS_DEBUG")
endif()

这意味着 VERBS_DEBUG 宏被定义 ,rdma-core 源码中所有 #ifdef VERBS_DEBUG 保护下的调试日志、断言和额外检查代码都会被编译进二进制。同时,Debug 类型默认使用 -O0 -g,生成完整的 DWARF 调试信息。

从源码直接进行 Debug 构建:

bash 复制代码
cd rdma-core
mkdir -p build-debug && cd build-debug

cmake -G Ninja \
    -DCMAKE_BUILD_TYPE=Debug \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DCMAKE_C_FLAGS="-O0 -g3" \
    -DCMAKE_CXX_FLAGS="-O0 -g3" \
    ..

ninja
sudo ninja install

-g3 比默认的 -g 包含更多调试信息(如宏定义),对深入分析实现细节有帮助。

3.2 使用 EXTRA_CMAKE_FLAGS 环境变量

如果你使用 build.sh 脚本,可以通过 EXTRA_CMAKE_FLAGS 环境变量传递 Debug 构建标志。这是 rdma-core 官方推荐的覆盖构建类型的方式:

bash 复制代码
cd rdma-core

export EXTRA_CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=Debug -DENABLE_WERROR=1"

bash build.sh

-DENABLE_WERROR=1 将警告视为错误,有助于在调试构建中捕捉潜在问题。编译产物位于 build/bin/ 和 build/lib/ 中,包含完整的调试符号,可直接用 GDB 加载。

3.3 验证 Debug 构建是否生效

bash 复制代码
cd rdma-core/build-debug

# 检查编译标志
grep -r "CMAKE_BUILD_TYPE" CMakeCache.txt
# 应输出:CMAKE_BUILD_TYPE:STRING=Debug

# 确认调试符号存在
file bin/ibv_devices
# 应包含 "with debug_info" 或 "not stripped"

# 使用 GDB 验证符号可加载
gdb -batch -ex "info sources" bin/ibv_devices 2>&1 | head -5

3.4 Debug 与 Release 构建的差异对比

特性 Release Debug
优化级别 -O2 -O0
调试符号 有(RelWithDebInfo 默认),Release 可剥离 完整 DWARF(-g3 更丰富)
NDEBUG 定义(关闭 assert) 未定义(assert 生效)
VERBS_DEBUG 未定义 定义(启用调试日志和检查)
适合场景 性能测试、生产部署 源码阅读、GDB 调试、日志分析

四、加载 RXE 内核模块

Soft-RoCE 的内核驱动 rdma_rxe 在现代内核中已内置,无需额外编译内核模块。

bash 复制代码
# 加载 RDMA 核心子系统
sudo modprobe rdma

# 加载 Soft-RoCE 驱动
sudo modprobe rdma_rxe

# 确认模块已加载
lsmod | grep rdma_rxe

预期输出类似:

复制代码
rdma_rxe             163840  0
ib_uverbs             163840  0
rdma_cm               163840  0
ib_core               450560  6 rdma_cm,rdma_rxe,ib_uverbs,...

如果 rdma_rxe 加载失败,检查内核配置是否启用了 CONFIG_RDMA_RXE:

bash 复制代码
grep CONFIG_RDMA_RXE /boot/config-$(uname -r)
# 应输出 CONFIG_RDMA_RXE=m

五、创建和配置 RXE 设备

bash 复制代码
# 查看网络接口名称(假设为 ens33 或 eth0)
ip link show

# 创建 RXE 设备,绑定到指定以太网接口
sudo rdma link add rxe_ens33 type rxe netdev ens33

# 验证设备已创建
rdma link show

成功输出中会显示 rxe_ens33 设备:

复制代码
link rxe_ens33/1 state ACTIVE physical_state LINK_UP netdev ens33

5.2 使用 rxe_cfg 脚本(传统方式)

rxe_cfg 是 rdma-core 自带的 RXE 配置脚本:

bash 复制代码
# 查看当前配置状态
sudo rxe_cfg status

# 启动 RXE 并添加设备
sudo rxe_cfg start
sudo rxe_cfg add ens33

# 查看设备
rdma link show

5.3 验证 RDMA 设备可见

bash 复制代码
ibv_devices
# 输出应包含 rxe_ens33 或 rxe0

ibv_devinfo -d rxe_ens33
# 查看设备详细信息:GID 表、端口状态、MTU 等

如果使用源码编译安装的 rdma-core,工具的路径可能为 rdma-core/build-debug/bin/ibv_devinfo(如果未执行 ninja install)。

六、功能测试与验证

6.1 使用 rping 测试 RDMA CM 连接

rping 是 RDMA CM(通信管理器)的基本连通性测试工具,适合验证 RXE 设备的基本通信能力。

服务端(假设 IP 为 192.168.1.100):

bash 复制代码
rping -s -a 192.168.1.100 -v

客户端 (在同一主机上测试时,服务端用回环 IP 127.0.0.1):

bash 复制代码
rping -c -a 127.0.0.1 -v

客户端会持续输出滚动字母序列,表示 RDMA Read 操作成功。按 Ctrl+C 终止。

6.2 使用 ibv_rc_pingpong 测试 RC 传输

ibv_rc_pingpong 通过 Reliable Connected 传输进行 ping-pong 测试。

服务端:

bash 复制代码
ibv_rc_pingpong -d rxe_ens33 -g 0

客户端(连接同一主机的服务端):

bash 复制代码
ibv_rc_pingpong -d rxe_ens33 -g 0 127.0.0.1

输出示例:

复制代码
local address: LID 0000 QPN 0x0011 PSN 0x... 
GID: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
remote address: LID 0000 QPN 0x0012 PSN 0x...
8192000 bytes in 0.01 seconds = 6553.60 Mbit/sec
1000 iters in 0.01 seconds = 10.00 usec/iter

6.3 使用 perftest 进行性能测试(可选)

bash 复制代码
# 服务端
ib_send_bw -d rxe_ens33 -g 0

# 客户端
ib_send_bw -d rxe_ens33 -g 0 127.0.0.1

预期性能参考:Soft-RoCE 在 10G 网络下吞吐量可达线速的 90% 左右,延迟约 100 微秒量级。

七、使用 GDB 调试 Debug 构建的 rdma-core

Debug 构建保留了完整的符号和源码映射,可以用 GDB 直接跟踪用户态 RDMA 库的执行流程。以下以跟踪 ibv_devices 的启动过程为例:

bash 复制代码
cd rdma-core/build-debug

# 加载 ibv_devices 并设置断点
gdb bin/ibv_devices

# 在 GDB 中:
(gdb) break ibv_get_device_list
(gdb) run
(gdb) bt          # 查看调用栈
(gdb) list        # 显示源码
(gdb) step        # 逐步跟踪

由于 VERBS_DEBUG 宏在 Debug 构建中被定义,rdma-core 源码中相关调试日志会输出到 stderr。如果你需要逐行阅读 RXE 用户态实现 ,源码位于 rdma-core/providers/rxe/ 目录(如果存在)以及 libibverbs 的通用实现中。注意,Soft-RoCE 的内核态实现位于 Linux 内核的 drivers/infiniband/sw/rxe/ 目录 ,用户态 rdma-core 主要负责 libibverbs 抽象层和 rdma_rxe 设备的配置接口。

八、清理与卸载

bash 复制代码
# 删除 RXE 设备
sudo rdma link delete rxe_ens33

# 卸载内核模块(可选)
sudo modprobe -r rdma_rxe

# 如果通过源码安装到了系统,卸载 rdma-core
cd rdma-core/build-release   # 或 build-debug
sudo ninja uninstall

九、常见问题排查

rdma link add 报错 "Operation not supported" :检查内核是否启用了 CONFIG_RDMA_RXE,以及 rdma_rxe 模块是否已加载。

ibv_devinfo 找不到 rxe 设备 :确认 rdma link show 中设备状态为 ACTIVE,且 netdev 对应的以太网接口处于 UP 状态。

编译时 CMake 找不到 libnl :确认已安装 libnl-3-dev 和 libnl-route-3-dev,然后清除构建目录重新运行 CMake。

Debug 构建后工具运行变慢或输出异常 :这是预期的------VERBS_DEBUG 启用了额外检查和日志,-O0 也降低了执行效率。调试完成后应切换回 Release 或 RelWithDebInfo 构建。

十、其他工具说明

如果从apt 安装的话,需要安装如下几个软件:

bash 复制代码
sudo apt update
sudo apt install -y \
    rdma-core \
    libibverbs-dev \
    ibverbs-utils \
    infiniband-diags \
    rdmacm-utils \
    perftest \
    librdmacm-dev \
    iproute2

其中,rdma-core 只是 Soft-RoCE 用户态核心栈的一部分,而且它本身并不是 Soft-RoCE 的"实现" 。Soft-RoCE 真正的核心是 Linux 内核里的 rdma_rxe 模块,它通常由内核包提供,不在你列出的这些 apt 包里。

从 rdma-core 源码编译并安装,会提供 libibverbs-dev 和 librdmacm-dev 这两个包里的核心内容(头文件和库) ,但它不会生成同名的 Debian/Ubuntu 软件包。

🎯 核心结论:源码编译产出的是"文件",不是"软件包"

libibverbs-dev 和 librdmacm-dev 是 Debian/Ubuntu 的软件包命名 。它们由发行版的维护者,基于 rdma-core 的源码,根据打包规则(如 debian/control 文件)拆分和构建而来。

当你直接从 rdma-core 的 Git 仓库克隆源码并编译时,你执行的是项目自身的构建系统(CMake)。这个过程会直接编译出所有库、工具和头文件,但不会 自动把它们打包成 .deb 文件。

📦 源码编译实际会提供什么

rdma-core 的 CMake 构建系统会生成并安装以下内容,功能上覆盖了开发包的需求:

  1. 核心库文件

    • libibverbs :对应 libibverbs-dev 中的库文件部分。
    • librdmacm :对应 librdmacm-dev 中的库文件部分。
  2. 开发头文件

    • 安装过程会将 verbs.h、rdma_cma.h 等头文件复制到系统的 include 目录(通常是 /usr/include/),这正是 -dev 包的核心作用。
  3. 运行时工具与 Provider 插件

    • 会生成 ibv_devices、ibv_devinfo 等工具,以及 RXE 等驱动程序的 Provider 插件。

上述 apt 列出的包可以分成几类:

包名 来源/类别 作用 是否 Soft-RoCE 必需
rdma-core rdma-core 项目,用户态 RDMA 核心 提供 libibverbs、librdmacm 运行库、守护进程、rxe_cfg 等 用户态核心,必需
iproute2 独立网络工具 提供 rdma 命令,如 rdma link add ... type rxe 创建 RXE 设备常用且必需
ibverbs-utils rdma-core 项目拆出的工具 ibv_devices、ibv_devinfo、ibv_rc_pingpong 等 测试/诊断,非运行必需
rdmacm-utils rdma-core 项目拆出的工具 rping、ucmatose 等 RDMA CM 测试工具 测试,非必需
perftest 独立项目 ib_send_bw、ib_write_bw、ib_read_lat 等性能测试 性能测试,非必需
infiniband-diags 独立项目 ibstat、iblinkinfo、perfquery 等 IB 子网诊断 对 RXE 用处有限,非必需
libibverbs-dev rdma-core 项目开发包 verbs.h 等头文件,编译 libibverbs 程序 开发才需要
librdmacm-dev rdma-core 项目开发包 rdma_cma.h 等头文件,编译 librdmacm 程序 开发才需要

更准确地说,Soft-RoCE 由两部分组成:

  1. 内核态 :rdma_rxe 模块

    位于 Linux 内核 drivers/infiniband/sw/rxe/,通常由 linux-modules-extra-$(uname -r) 或内核本身提供。

    检查/安装:

    bash 复制代码
    modprobe rdma_rxe
    # 如果失败:
    sudo apt install linux-modules-extra-$(uname -r)
  2. 用户态 :rdma-core 提供的库和工具

    • rdma-core 包:运行库、rxe_cfg、ibacm 等
    • iproute2 包:rdma 命令,用来 rdma link add ... type rxe
    • ibverbs-utils / rdmacm-utils:测试工具
    • -dev 包:开发头文件

所以,运行 Soft-RoCE 的最小集合大致是:

bash 复制代码
sudo apt install rdma-core iproute2

然后加载内核模块:

bash 复制代码
sudo modprobe rdma_rxe

如果要测试,再加:

bash 复制代码
sudo apt install ibverbs-utils rdmacm-utils perftest

如果要自己写程序编译,再加:

bash 复制代码
sudo apt install libibverbs-dev librdmacm-dev

infiniband-diags 主要面向真正的 InfiniBand 子网管理,Soft-RoCE 下很多命令不适用,可以不装。

总结:

  • rdma-core 是 Soft-RoCE 用户态核心的一部分,但不是 Soft-RoCE 的全部,也不是内核实现。
  • iproute2 提供了创建 RXE 设备的关键 rdma 命令。
  • 其余包是测试、诊断、开发工具,不属于 Soft-RoCE 本身,但调试和验证时很有用。
相关推荐
gwf2161 天前
常见驱动问题定位与解决:设备识别、性能不达预期、CQ错误码 —— 资深RDMA驱动调试排错指南
驱动开发·linux内核·性能调优·rdma·故障排查·mlx5·irdma
Eloudy2 天前
DOCA GPUNetIO 开源版(GDAKI)实现分析
gpu·rdma·roce
gwf2163 天前
RoCEv2网络性能调优:DCQCN、ECN与PFC协同驱动级深度解析
驱动开发·rdma·rocev2·linuxkernel·pfc·dcqcn·ecn
Eloudy3 天前
MLNX_OFED 的 install.pl 安装流程分析
网络·rdma·roce
Eloudy3 天前
RoCE UC Receive 实现代码结构与原理分析
rdma·roce
Eloudy3 天前
RoCE 的 UC SEND/RECEIVE 的完整交互过程分析
网络·rdma·roce
论文复现现场5 天前
8卡 A100 服务器哪里租?NVLink、RDMA 与 NCCL 验收指南
linux·服务器·php·分布式训练·rdma·nvlink·nccl
gwf2166 天前
RDMA事件与异步通知机制:CMA事件与设备事件深度解析
驱动开发·linux内核·rdma·rdma_cm·异构计算·异步事件·cve分析
cyf317 天前
RDMA 写操作带宽性能建模与参数敏感性分析
性能优化·rdma·rocev2