3、环境搭建:安装RDMA网卡驱动、配置IP、验证rdma_cm与ibverbs工具集
RDMA(Remote Direct Memory Access)技术的落地,离不开一套完整且正确配置的软硬件环境。无论是后续要进行的 Send/Receive 操作,还是 Read/Write 操作,其底层都依赖于网卡驱动、协议栈工具集以及IP网络的协同工作。本章将聚焦于实验环境的搭建全流程,从驱动安装、IP配置到工具集验证,帮助您建立起一个可用的RDMA测试平台。需要特别强调的是,RDMA环境搭建并非简单的“装驱动、配IP”,它涉及内核模块、固件版本、子网管理器(SM)以及用户态与内核态工具链的匹配问题,任何一个环节的疏漏都可能导致 ibv_devinfo 无法识别设备或 rdma_cm 连接超时。
上图展示了RDMA环境搭建的整体链路架构。从硬件层到工具层,每一层都有其对应的验证测试点(TP)。在实际操作中,我们通常按照“自下而上”的顺序进行排查与配置:首先确保硬件被系统识别,然后加载正确的驱动,接着配置IP并确认端口状态,最后使用工具集进行连通性验证。下面我们将分步骤展开详细操作。
3.1 安装RDMA网卡驱动:从硬件识别到内核模块加载
核心原理
RDMA网卡(如Mellanox ConnectX系列、Broadcom NetXtreme系列)通常通过PCIe接口与主机相连。操作系统需要识别PCIe设备,并加载对应的内核驱动模块,才能将网卡暴露为RDMA设备(即 /dev/infiniband/ 下的设备节点)。驱动分为两部分:内核态驱动(负责数据通路与硬件交互)和用户态驱动(通过 verbs API 提供用户空间接口)。对于Mellanox网卡,常见的驱动为 mlx5_core 和 mlx5_ib;对于RoCE(RDMA over Converged Ethernet)模式,还需要依赖以太网驱动(如 mlx5_en)。
操作流程
- 确认硬件识别:使用
lspci | grep -i mellanox或lspci | grep -i infiniband查看PCIe总线上是否能看到RDMA网卡。若输出为空,请检查硬件插槽和BIOS设置。 - 安装驱动包:对于CentOS/RHEL系统,推荐使用官方MLNX_OFED驱动包。下载对应内核版本的驱动后,执行
./mlnxofedinstall --all。对于Ubuntu,可使用apt-get install mlnx-ofed-kernel-dkms或直接安装发行版自带的rdma-core包。 - 加载内核模块:安装完成后,执行
modprobe mlx5_core和modprobe mlx5_ib。若需要开机自动加载,请将模块名写入/etc/modules-load.d/下的配置文件。 - 验证设备节点:执行
ls /dev/infiniband/,应能看到类似rdma0、issm0、uverbs0等设备节点。同时,使用ibv_devinfo命令可查看设备详情。
Unknown symbol 错误,请检查内核头文件是否安装(yum install kernel-devel 或 apt-get install linux-headers-$(uname -r))。另外,不要在业务运行期间随意升级固件,以免造成链路中断。
案例拆解:Mellanox CX-5 驱动安装实录
某实验环境使用了两台配备 ConnectX-5 网卡的服务器,操作系统为 Ubuntu 20.04,内核版本 5.4.0。初始安装时,系统自带的 mlx5_core 驱动版本较旧,导致 ibv_devinfo 无法显示设备。我们采取了以下步骤:
- 下载 MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz,解压后执行
./mlnxofedinstall --force。 - 安装过程中提示缺少
python3-dev和gcc,通过apt-get install -y python3-dev gcc解决。 - 安装完成后,执行
reboot。重启后,ibv_devinfo正常显示设备,端口状态为PORT_ACTIVE。
复盘:关键点在于使用 --force 参数覆盖了系统自带的驱动,避免了版本冲突。同时,安装前务必检查依赖包,否则会中断安装进程。
3.2 配置IP地址与子网管理器:确保物理链路可用
核心原理
对于RoCE v2(最常用的RDMA协议),其底层依赖IP网络进行路由。因此,必须为RDMA网卡配置IP地址,且该IP地址必须与对端可达。此外,在InfiniBand(IB)模式下,还需要子网管理器(Subnet Manager,SM)来配置端口状态和路径。而在RoCE模式下,通常不需要独立的SM,但需要确保交换机的PFC(优先级流控)和ECN(显式拥塞通知)配置正确,以保证无损网络。
配置步骤
- 查看网卡接口名:使用
ip link show找到RDMA网卡对应的以太网接口,通常命名为ens2f0或ib0(IB模式)。 - 配置IP地址:对于RoCE,执行
ip addr add 192.168.1.10/24 dev ens2f0,并启用接口ip link set ens2f0 up。对于IB模式,使用ip addr add 10.0.0.1/24 dev ib0。 - 确认端口状态:使用
ibstat或ibv_devinfo查看物理端口状态,应显示Active。若显示Down,请检查网线/光模块连接,以及交换机配置。 - 验证GID:执行
show_gids命令,确认存在有效的GID(Global ID)。GID是RDMA通信中用于标识端点的地址,RoCE模式下通常基于IP地址生成。
iptables -I INPUT -p udp --dport 4791 -j ACCEPT 进行放行。
常见误区
- 误区一:认为配置了IP就万事大吉,忽略了物理端口状态。实际上,如果端口未激活,IP配置无效。
- 误区二:在IB模式下忘记启动opensm(子网管理器)。IB网络必须有一个SM来管理网络,否则端口状态会一直停留在
Down。启动方式:systemctl start opensm。 - 误区三:混淆了RoCE v1和RoCE v2的差异。RoCE v1需要以太网类型字段,而RoCE v2使用UDP/IP封装,两者不兼容。
3.3 验证rdma_cm与ibverbs工具集:打通用户态通信链路
核心原理
rdma_cm(RDMA Connection Manager)是用于建立和管理RDMA连接的高级API,它屏蔽了底层QP(Queue Pair)和CQ(Completion Queue)的细节,提供了类似TCP socket的编程模型。而ibverbs是更底层的verbs API,允许用户直接控制QP、MR(Memory Region)等资源。验证这两个工具集,是为了确认用户态库与内核驱动之间的交互正常,且能够成功建立连接。
验证工具与命令
| 工具集 | 命令 | 用途 | 预期结果 |
|---|---|---|---|
| rdma_cm | rdma_client / rdma_server | 测试CM连接建立 | 客户端显示 "connect successful" |
| rdma_cm | udp_client / udp_server | 测试可靠数据报通信 | 数据收发成功 |
| ibverbs | ibv_devinfo | 查看设备能力 | 显示端口状态、固件版本 |
| ibverbs | ibv_rc_pingpong | 测试RC(可靠连接)通信 | 显示带宽和延迟 |
| ibverbs | ib_write_bw / ib_read_bw | 测试读写带宽 | 显示吞吐量数据 |
操作流程
- 检查工具是否安装:执行
which rdma_client和which ibv_devinfo。若未安装,使用yum install rdma-core perftest或apt-get install rdma-core perftest。 - 运行rdma_cm测试:在服务器A上启动
rdma_server,在服务器B上运行rdma_client -s 服务器A的IP。观察连接是否建立。 - 运行ibverbs测试:在服务器A上执行
ibv_rc_pingpong -d mlx5_0 -p 1,在服务器B上执行ibv_rc_pingpong -d mlx5_0 -p 1 服务器A的IP。该命令会进行1000次消息交换,并输出延迟数据。
rdma_client 连接超时,首先检查 ibstat 中的端口状态是否为 Active。其次,使用 tcpdump -i ens2f0 udp port 4791 抓包,确认是否有UDP包到达。若抓不到包,说明IP路由或防火墙有问题。
案例拆解:一次连接失败的完整排查
在两台服务器上执行 ibv_rc_pingpong 时,客户端报错 Resource temporarily unavailable。我们进行了如下排查:
- 第一步:检查
ibv_devinfo,发现端口状态为PORT_ACTIVE,排除物理层问题。 - 第二步:检查
show_gids,发现GID索引为0的条目为空。这是因为IP地址配置后,GID未自动生成。执行ip addr flush dev ens2f0后重新配置IP,GID恢复正常。 - 第三步:再次运行
ibv_rc_pingpong,成功输出延迟数据。
复盘:根因是IP地址配置时使用了旧的IP,导致GID表未更新。这提醒我们,在修改IP后,务必检查GID表是否同步更新。
3.4 环境验证清单与常见问题总结
验证清单
| 检查项 | 命令 | 通过标准 |
|---|---|---|
| 硬件识别 | lspci | grep -i mellanox | 显示网卡型号 |
| 驱动加载 | lsmod | grep mlx5 | 显示 mlx5_core 和 mlx5_ib |
| 设备节点 | ls /dev/infiniband/ | 存在 uverbs0 等节点 |
| 端口状态 | ibstat | State: Active |
| IP连通性 | ping 对端IP | 丢包率0% |
| GID有效性 | show_gids | 存在非零GID |
| CM连接 | rdma_client | 连接成功 |
| 数据通路 | ibv_rc_pingpong | 延迟数据正常输出 |
常见误区与复盘
- 误区一:忽略内核版本与驱动版本的兼容性。建议使用
uname -r查看内核版本,并选择对应的OFED版本。 - 误区二:在RoCE环境中未配置交换机的PFC/ECN。这会导致在高负载下丢包,RDMA性能急剧下降。虽然不影响基本连通性,但会影响后续的带宽测试。
- 误区三:使用
ibv_devinfo看到设备就认为一切正常,忽略了端口状态。端口状态是判断物理链路是否可用的关键指标。
Couldn't open device 错误,通常是因为用户态驱动与内核态驱动版本不匹配。请确保 rdma-core 库版本与内核模块版本一致。可以通过 ibv_devinfo -v 查看详细版本信息。