1. RDMA SEND操作的本质理解
RDMA(Remote Direct Memory Access)技术中的SEND操作是最基础也是最核心的通信原语之一。与传统的TCP/IP网络通信不同,SEND操作完全绕过了操作系统内核,实现了应用层到应用层的直接内存访问。这种设计带来的性能提升是惊人的——在实际测试中,基于Mellanox ConnectX-6 DX网卡的SEND操作延迟可以低至0.8微秒,而带宽则能达到200Gbps的线速。
理解SEND操作需要把握三个关键特性:
- 零拷贝(Zero-copy):数据直接从发送方用户态缓冲区传输到接收方用户态缓冲区,避免了内核缓冲区的拷贝开销
- 内核旁路(Kernel bypass):通信过程完全由网卡处理,不经过操作系统协议栈
- 远程直接内存访问(Remote DMA):网卡可以直接读写对端应用程序注册的内存区域
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SEND操作的工作流程拆解
2.1 发送端处理流程
发送端的完整处理链条包含以下关键步骤:
- 内存注册:
c复制struct ibv_mr *mr = ibv_reg_mr(pd, buf, size,
IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE);
内存注册是RDMA操作的前提,需要指定保护域(PD)、内存区域、大小和访问权限。这个操作会将用户缓冲区映射到网卡的地址空间,并返回一个内存区域(MR)描述符。
- 创建发送请求:
c复制struct ibv_sge sg = {
.addr = (uintptr_t)buf,
.length = len,
.lkey = mr->lkey
};
struct ibv_send_wr wr = {
.wr_id = (uintptr_t)ctx,
.sg_list = &sg,
.num_sge = 1,
.opcode = IBV_WR_SEND,
.send_flags = IBV_SEND_SIGNALED
};
发送请求包含一个或多个分散/聚合元素(SGE),每个SGE描述一个内存区域。关键参数包括:
- opcode:指定操作类型(IBV_
