摘要:应用提交工作请求(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网卡的核心组件:
性能收益:
延迟降低:从毫秒级降至微秒级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一点号
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!