news 2026/8/22 15:54:08

RDMA数据传输操作:Send/Recv与Read/Write全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RDMA数据传输操作:Send/Recv与Read/Write全解析

摘要:本文深入解析RDMA的四种核心数据传输操作:Send/Recv与Read/Write。我们将探讨消息语义与内存语义的本质区别,剖析RDMA如何通过硬件级授权实现“零拷贝”与“零CPU干预”。结合AI大模型训练中的GPUDirect RDMA实战场景,带你彻底搞懂不同操作的适用边界,助你构建高性能分布式系统。

大家好,我是你们的老朋友,专注RDMA与智能网卡技术的博主。👋 提到RDMA(远程直接内存访问),大家第一反应肯定是“零拷贝”、“低延迟”。但你知道吗?RDMA之所以能大显身手,全靠其底层定义的几种“数据传输操作”。今天我们就来扒一扒RDMA的四大基本操作:Send/Recv、Read/Write,看看它们到底是怎么把通信延迟“打下来”的!🚀

一、RDMA的“底层信任”:内存注册与授权机制

在深入具体操作前,我们必须先搞懂一个核心前提:远程内存不能随意访问!就像你不能未经允许闯入别人的仓库,RDMA能直接操作远程内存,核心是建立了一套“硬件级的信任与授权机制”。

这套机制的核心是内存区域(MR, Memory Region)密钥(Key)。当目标端要开放一块内存给远程访问时,会通过驱动将该内存注册为MR,锁定物理地址,并生成两个密钥:

  • L_Key(Local Key):本地应用验证权限的钥匙。
  • R_Key(Remote Key):通过安全通道传递给发起端的“访问凭证”。

发起端在执行RDMA Read/Write时,必须在请求中携带R_Key和目标地址。目标端网卡(RNIC)收到请求后,硬件会自动验证R_Key并映射物理地址。整个授权过程由硬件完成,无需CPU参与,既安全又高效!🔐

二、Send/Recv:传统又可靠的“快递签收”

Send/Recv属于消息语义(Message Semantics),它最接近我们熟悉的传统Socket编程。

工作流程

  1. 接收方准备:接收方必须提前在接收队列(RQ)中发布接收请求(Post Recv),指定好存放数据的缓冲区。就像快递上门前,你必须得有人在家准备签收。
  2. 发送方投递:发送方将数据放入发送队列(SQ),网卡将数据发送到网络。
  3. 接收方处理:数据到达后,目标端RNIC将数据放入预先指定的缓冲区,并在完成队列(CQ)中生成完成事件(CQE),通知接收方CPU“快递已签收”。

💡适用场景:适合双向交互频繁、消息边界清晰的场景,如RPC调用、控制面信令交互。由于接收方CPU需要处理CQ事件,在极高频通信下,CPU的“签收”开销会成为瓶颈。

三、RDMA Write:“送货上门不敲门”的远程推送

如果说Send/Recv是传统快递,那RDMA Write就是“送货上门不敲门”的智能快递柜!它属于内存语义(Memory Semantics)

工作流程

  1. 授权准备:接收方将内存注册为MR,获取R_Key和远程虚拟地址(RVA),并传给发送方。
  2. 一键推送:发送方构造Write请求,带上本地数据地址、目标R_Key和RVA,丢入SQ后直接去干别的事了
  3. 静默写入:目标端RNIC收到数据,验证R_Key后,直接通过DMA将数据写入目标内存

核心特性接收方完全无感知!目标端不需要提前Post Recv,写入完成后也不会给目标端应用发送CQE通知。只有发送方能在自己的CQ中知道“货已送达”。

💡适用场景:单向数据分发的“效率之王”。例如AI训练的参数广播(Parameter Server向Worker推送权重),或者分布式日志集中写入。接收方CPU完全不用管,数据到了直接用!

四、RDMA Read:“按需自取”的远程拉取

RDMA Read同样是内存语义,但方向相反,它是“按需自取”。

工作流程

  1. 授权准备:数据持有方(目标端)将内存注册为MR,获取R_Key和RVA,传给读取方。
  2. 精准提货:读取方构造Read请求,带上目标R_Key、RVA以及本地用于存放数据的缓冲区地址,丢入SQ。
  3. 远程DMA:目标端RNIC收到请求,验证R_Key后,主动将指定内存的数据通过DMA读取并发送回请求方

🔥核心特性:同样是单向操作,目标端无感知。目标端不需要发布任何请求,数据被“抽走”时,目标端CPU甚至操作系统都不知道。

💡适用场景:多对一的数据聚合与按需访问。最典型的就是分布式存储和键值系统(KV Store)。客户端需要读取数据时,直接发起RDMA Read从服务端内存“拿”数据,服务端CPU零开销,延迟从几十微秒暴降到几微秒!

五、四大操作全景对比

为了让大家更直观地理解,我们整理了一张对比表:

操作类型语义类型接收方需提前准备?接收方CPU感知?典型应用场景
Send/Recv消息语义✅ 需要 (Post Recv)✅ 需处理CQERPC控制面、双向消息交互
RDMA Write内存语义❌ 不需要❌ 无感知参数广播、日志写入、状态同步
RDMA Read内存语义❌ 不需要❌ 无感知分布式存储读取、KV查询
Atomic内存语义❌ 不需要❌ 无感知分布式锁、计数器、一致性协议

(注:Atomic原子操作也是内存语义,提供硬件级的Fetch&Add、CAS等不可分割操作,是分布式一致性的硬件基石。)

六、实战前沿:AI大模型中的 GPUDirect RDMA (GDR)

了解了基础操作,我们来看看它们在当今最火的AI大模型训练中是怎么大显身手的。🚀

在千卡GPU集群中,多机多卡的AllReduce通信是核心瓶颈。传统RDMA需要把GPU显存数据先拷贝到主机内存(D2H),再通过RNIC发出去,远端再H2D拷贝,两次内存拷贝极其浪费PCIe带宽和CPU资源

GPUDirect RDMA (GDR)彻底解决了这个问题!

  • 底层依赖:PCIe P2P(对等访问)。
  • 数据路径:本地GPU显存 ←PCIe P2P→ RNIC → 网络 → 远端RNIC ←PCIe P2P→ 远端GPU显存。
  • 操作实现:在NCCL(NVIDIA集合通信库)中,底层大量使用RDMA Write/Read。RNIC直接通过PCIe DMA读写GPU显存,完全绕过主机内存
// 伪代码:将GPU显存注册为RDMA MRstructibv_mr*mr=ibv_reg_mr(pd,gpu_device_ptr,size,IBV_ACCESS_LOCAL_WRITE|IBV_ACCESS_REMOTE_WRITE|IBV_ACCESS_REMOTE_READ);// 拿到R_Key后,即可通过 ibv_post_send 发起 RDMA Write/Read

在GDR场景下,CPU只负责提交“快递订单”(WR),RNIC硬件自己上门去GPU显存取货/送货,数据面彻底解放了CPU!🎉

七、总结

RDMA的精髓在于将“跨节点通信”转化为“本地内存访问”。Send/Recv保留了传统消息的可靠性,而Read/Write/Atomic则通过内存语义将CPU开销降到了极致。在实际架构设计中:

  • 控制面/信令交互:用 Send/Recv。
  • 数据面/大流量搬运:用 Read/Write。

希望这篇文章能帮你彻底理清RDMA的操作逻辑!如果你觉得有收获,欢迎点赞、收藏、关注三连支持!👇 关于RDMA还有什么想了解的,欢迎在评论区留言,我们下期见!


本文为RDMA智能网卡技术知识系列文章,首发于CSDN,转载请注明出处。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 15:51:21

AnythingLLM 教程:10 分钟搭建一个本地私有知识库问答应用

AnythingLLM 教程:10 分钟搭建一个本地私有知识库问答应用 【免费下载链接】anything-llm Stop renting your intelligence. Own it with AnythingLLM. Everything you need for a powerful local-first agent experience 项目地址: https://gitcode.com/GitHub_…

作者头像 李华
网站建设 2026/8/22 15:43:33

我的价值观

世界上最不负责人的话就是穷穷养,富富养,儿孙自有儿孙福。

作者头像 李华
网站建设 2026/8/22 15:43:18

如何使用 draw.io 桌面版:离线绘图与批量导出完整指南

如何使用 draw.io 桌面版:离线绘图与批量导出完整指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop draw.io 桌面版是一个基于 Electron 的离线图表绘制工具&…

作者头像 李华