让传统IT系统跑飞起来-RDMA(Remote Direct Memory Access)

B站影视 日本电影 2025-09-29 12:53 1

摘要:应用提交工作请求(Work Request)到QPRNIC异步处理WR,无需CPU参与操作完成后在CQ中放置完成队列项(CQE)应用轮询CQ获知操作完成状态// Send/Recv操作ibv_post_send(qp, &send_wr); // 发送端ibv

我将深入详细地介绍RDMA技术,涵盖其核心原理、具体实现、应用场景及关键注意事项。

在传统TCP/IP网络通信中,数据路径存在严重开销:

// 传统TCP/IP数据流应用数据 -> 用户空间缓冲区 -> 内核socket缓冲区 -> TCP/IP协议栈处理 -> 网卡缓冲区多次内存拷贝:用户空间与内核空间间的数据复制上下文切换:用户态与内核态的频繁切换CPU参与:协议栈处理消耗大量CPU周期高延迟:完整路径延迟在毫秒级别// RDMA内存注册流程1. 应用分配内存区域(Memory Region)2. 调用ibv_reg_mr注册到RNIC3. RNIC锁定物理页,建立DMA映射4. 返回本地密钥(lkey)和远程密钥(rkey)

技术细节

内存注册确保物理页面被锁定,不会被换出建立虚拟地址到物理地址的映射表rkey作为远程访问的权限凭证

RDMA通信基于三个核心队列:

// RDMA队列结构struct ibv_qp { // 队列对struct ibv_send_wq *sq; // 发送队列struct ibv_recv_wq *rq; // 接收队列};struct ibv_cq *cq; // 完成队列

工作流程

应用提交工作请求(Work Request)到QPRNIC异步处理WR,无需CPU参与操作完成后在CQ中放置完成队列项(CQE)应用轮询CQ获知操作完成状态// Send/Recv操作ibv_post_send(qp, &send_wr); // 发送端ibv_post_recv(qp, &recv_wr); // 接收端(必须预先发布)特点:需要接收端参与,类似传统消息传递数据流:数据直接写入接收端预先注册的缓冲区// RDMA Write操作struct ibv_sge list = {addr, length, lkey};struct ibv_send_wr wr = {.wr_id = 1,.opcode = IBV_WR_RDMA_WRITE,.sg_list = &list,.num_sge = 1,.send_flags = IBV_SEND_SIGNALED,.wr.rdma.remote_addr = remote_addr,.wr.rdma.rkey = rkey};特点:完全绕过远程CPU,只需知道远程内存地址和rkey优势:极低延迟,零CPU参与// RDMA Read操作struct ibv_send_wr wr = {.opcode = IBV_WR_RDMA_READ,// ... 其他参数类似Write};协议网络要求传输层路由能力性能部署成本InfiniBand专属网络专属协议有限最优最高RoCEv2无损以太网UDP支持IP路由接近IB中等iWARP标准以太网TCP完全路由良好较低

现代RDMA网卡的核心组件:

// 1. 设备发现与上下文创建struct ibv_context *ctx = ibv_open_device(device);struct ibv_pd *pd = ibv_alloc_pd(ctx);// 2. 内存注册struct ibv_mr *mr = ibv_reg_mr(pd, buffer, size, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE);// 3. 队列创建struct ibv_cq *cq = ibv_create_cq(ctx, CQ_SIZE, NULL, NULL, 0);struct ibv_qp *qp = ibv_create_qp(pd, &qp_init_attr);// 4. 连接建立ibv_modify_qp(qp, &attr, IBV_QP_STATE | IBV_QP_AV | ...);// 原子操作支持IBV_ACCESS_REMOTE_ATOMIC// 内存窗口(更灵活的内存保护)struct ibv_mw *mw = ibv_alloc_mw(pd, IBV_MW_TYPE_1);// 共享接收队列(优化多QP场景)struct ibv_srq *srq = ibv_create_srq(pd, &srq_init_attr);# 传统TCP-based All-Reducedef all_reduce_gradients(gradients):# 每个节点:序列化梯度 -> TCP发送 -> 接收 -> 反序列化serialized_data = serialize(gradients)for peer in peers:sock = socket.connect(peer)sock.send(serialized_data) # 内核拷贝开销# ... 接收处理类似// RDMA-based All-Reducevoid rdma_all_reduce(float *local_gradients, float *result) {// 1. 注册梯度缓冲区struct ibv_mr *grad_mr = ibv_reg_mr(pd, local_gradients, size, ...);// 2. 交换内存信息exchange_remote_keys(peers, grad_mr->rkey, (uintptr_t)local_gradients);// 3. 使用RDMA Read收集其他节点梯度for (int i = 0; i

性能收益

延迟降低:从毫秒级降至微秒级CPU释放:CPU专注于计算而非通信吞吐量提升:零拷贝带来更高带宽利用率传统存储栈:应用 -> VFS -> 文件系统 -> 块层 -> SCSI -> 网络栈 -> 网卡NVMe-of over RDMA:应用 -> NVMe驱动 -> RDMA Verbs -> RNIC# 传统iSCSI存储性能$ fio --name=test --ioengine=libaio --rw=randread --bs=4k --numjobs=1IOPS: ~50-100K, Latency: ~200us# NVMe-of over RDMA性能 $ fio --name=test --ioengine=libaio --rw=randread --bs=4k --numjobs=1IOPS: ~1-2M, Latency: ~20us# 调整交换机缓冲区大小hardware profile buffer scale large# 端口缓冲区分配interface Ethernet1/1buffer shared dynamic 10000buffer dedicated size 1000# 大页配置(减少TLB miss)echo 1024 > /proc/sys/vm/nr_hugepages# 绑定NUMA节点numactl --membind=0 --cpunodebind=0 ./rdma_application// 预创建QP池,避免运行时创建开销struct qp_pool {struct ibv_qp **qps;int size;pthread_mutex_t lock;};// 批量提交WR,减少Verbs调用次数struct ibv_send_wr wr_batch[16];ibv_post_send(qp, wr_batch); // 批量提交// 使用内存池避免频繁注册struct mem_pool {void *base_addr;size_t chunk_size;struct ibv_mr *mr;// ... 管理逻辑};// 注册大块内存,内部切割使用struct ibv_mr *large_mr = ibv_reg_mr(pd, huge_buffer, HUGE_SIZE, ...);# RNIC统计信息cat /sys/class/infiniband/mlx5_0/ports/1/counters/*# PFC统计(检查网络拥塞)ethtool -S eth0 | grep -i pfc# 完成队列溢出检查perfquery -C 1 -P 1 # 检查CQ overrun# RDMA性能分析ibv_rc_pingpong -d mlx5_0 -g 0 # 基准测试ib_write_bw -d mlx5_0 -F # 带宽测试# 详细性能剖析ibv_devinfo -v # 设备能力ibv_devices # 设备列表// 精细化的内存权限控制ibv_reg_mr(pd, buffer, size, IBV_ACCESS_LOCAL_WRITE | // 仅本地写IBV_ACCESS_REMOTE_READ); // 允许远程读,但不允许写// 使用内存窗口进行动态权限管理ibv_bind_mw(qp, mw, &bind_info);# vlan隔离RDMA流量vlan 100name rdma-traffic# ACL限制访问access-list RDMA permit ip host 10.1.1.1 host 10.1.1.2五、总结

RDMA技术通过内核旁路零拷贝远程内存直接访问三大核心机制,彻底重构了数据中心网络通信范式。其价值在AI训练、高性能存储、分布式数据库等场景中得到充分体现。

网络基础设施:必须构建无损以太网,正确配置PFC和ECN系统优化:关注NUMA、大页内存、中断亲和性等细节应用设计:采用合适的通信模式,优化内存管理和连接池持续监控:建立完善的监控体系,及时发现和解决性能问题

RDMA不是简单的"更快的网络",而是一种新的计算范式。它要求开发者和运维人员从架构层面重新思考数据流动和系统设计。对于追求极致性能的应用场景,投入RDMA技术栈带来的回报是巨大的。

来源:Allen一点号

相关推荐