☰
rdma-core 快速入门:5 步跑通你的第一个 RDMA 示例
2026/10/21 2:53:52 网站建设 项目流程

rdma-core 快速入门:5 步跑通你的第一个 RDMA 示例

【免费下载链接】rdma-coreRDMA core userspace libraries and daemons项目地址: https://gitcode.com/GitHub_Trending/rd/rdma-core

用 TCP 发送大文件时,数据要在内核协议栈里来回拷贝,高并发下延迟明显抬升。而 InfiniBand 或 RoCE 网卡支持 RDMA 模式,数据可以从应用内存直接发到网络上,再落到对端内存,内核只在建连和建资源时介入,不跟着每个字节走。rdma-core 是 Linux 内核 RDMA 子系统的用户态配套工程,包含 libibverbs 核心库、各厂商驱动代码和守护进程,还带了可直接运行的示例。按下面的步骤走,你可以从编译开始,一步步把第一个 RDMA 程序跑起来。

第一步:看懂 rdma-core 提供什么,调用链长什么样

仓库的组织很直观:libibverbs 是最核心的 API 库,providers/ 目录下是各厂商网卡的用户态驱动,mlx5、efa、irdma、rxe 都有;librdmacm/ 负责连接管理;srp_daemon、iwpmd、ibacm 是配套守护进程。

verbs API 有一个固定的最小调用链,先记住对象顺序,后面的示例都是按它展开的:

  • 设备上下文:先列设备,再打开设备。
  • 保护域:做逻辑隔离,资源都挂在它下面。
  • 内存区域:把应用内存注册给网卡,网卡才认这个地址。
  • 队列对和完成队列:数据提交走队列对,完成情况从完成队列取。

每一步都要用上一步返回的对象,顺序错了会直接失败。

第二步:从源码编译 rdma-core 并确认设备可见

项目用 cmake 构建。Debian 和 Ubuntu 用户先装好 README 列的依赖(cmake、libnl-3-dev 等),然后执行bash build.sh,产物在 build/bin 和 build/lib 里,示例程序就放在 build/bin 下。

构建完先做一件事:确认系统里有没有 RDMA 设备。ibv_devices列出设备名和 GUID,ibv_devinfo打印端口、GID 等更细的属性。这两个命令是所有后续操作的前置检查,设备都看不见就先别写代码。

第三步:没有 RDMA 网卡时,用 rxe 软件 RDMA 起步

手上没有专用网卡也没关系。内核自带 rxe 和 siw 两种软 RDMA 驱动,能在普通以太网卡上模拟出一个 RDMA 设备,用来学习和调通应用逻辑完全够用:

# modprobe rdma_rxe # rdma link add rxe0 type rxe netdev eth0 # ibv_devices

执行完用rdma link或ibv_devices验证,设备名会出现在输出里,后面的示例就可以用它跑。

第四步:跑通 rc_pingpong,观察一轮 RDMA 消息交换

rc_pingpong 是最值得精读的入门示例:两台机器,一端当服务端,一端当客户端,通过 TCP 交换 QP 和地址信息建好连接,之后用 RDMA SEND/RECV 来回发消息:

./rc_pingpong # 服务端 ./rc_pingpong <服务端IP> # 客户端

默认交换 1000 轮 4096 字节的消息,结束时打印带宽和延迟统计。常用选项:-d指定设备,-n改轮数,-e改用 CQ 事件等待代替轮询。这个示例把建连、QP 状态迁移、地址交换这些最容易写错的部分都处理好了,跑通之后改它,比从零写一个快得多。

第五步:三个高频坑位与调试入口

RDMA 程序的报错经常不在代码里,而在权限和资源限制上。

  • 设备列表为空:内核驱动或 uverbs 模块没加载,或 /dev/infiniband/ 下的设备节点不可读,先查这两个地方。
  • 注册内存失败:执行ulimit -l,如果锁定内存上限很小(比如 32 KB),注册稍大的内存区域就会失败,按 libibverbs 文档 的方法在 limits.conf 里调大。
  • 提交后一直不返回完成:完成队列没被轮询、或者忘了处理完成通道,先对照示例里的等待逻辑检查。

另外两个入口值得收藏:设VERBS_LOG_LEVEL环境变量可以打开库的调试日志,输出写到VERBS_LOG_FILE指向的文件;设备行为排查则用 infiniband-diags/ 里的ibstat、perfquery查看端口状态和性能计数器。

下一步:三个方向继续深入

想观察设备侧发生了什么,读 asyncwatch 示例,它轮询异步事件,能看到端口状态变化这类通知;想查端口细节就看 devinfo。不想写 C 的话,pyverbs/ 提供了同名对象的 Python 接口,适合先快速试验。仓库的 tests/ 目录还有按硬件分类的功能测试,挑一份适合你设备的跑一遍,是最贴近实战的练习。

建议你现在就做一件事:按 README 的构建说明编译 rdma-core,用ibv_devices确认设备,再在两台机器上把 rc_pingpong 跑通。跑通之后,你手里就有一个可以持续修改的基线了。

【免费下载链接】rdma-coreRDMA core userspace libraries and daemons项目地址: https://gitcode.com/GitHub_Trending/rd/rdma-core

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询