发布时间:2026/9/7 20:45:55
用RDMA实现文件传输 一、概述我们上一篇博客介绍了RDMA的相关概念本博客在此基础之上使用 verbs 编程实现 RDMA 文件传输演示代码已开源(Githubrdma-sendfile。如果你还不了解QP、WR、MR等 RDMA基本要素可以先花五分钟看看RDMA要素介绍。RDMA有IB、RoCE、iWARP三种协议然而上层的用户接口都是VerbsVerbs 可以看作HCA对主机提供的RDMA功能接口。RDMA 文件传输主要涉及两个部分的编码控制消息的传递文件数据的传输RDMA 提供了单边模式、双边模式两种工作模式对应send/recv、write/read 四种操作它们的特点和使用场景我们可以总结如下维度双边操作Send/Recv单边操作RDMA Read/Write远端CPU参与需要预先发布Recv WR不需要完全无感完成通知双方都产生CQE仅发起方产生CQE需要的信息只需本地缓冲区需要远端地址 rkey适用消息大小小消息控制类大消息数据类典型应用控制消息、元数据交换批量数据传输所以在我们的 RDMA 文件传输助手实现中控制消息的传递使用双边模式 send/recv而数据传输则使用单边的 write。主要的思路是先建链并使用双边模式传递控制消息然后复用链路进行单边模式 write 文件传输。二、控制消息传递控制消息: remote_addr、rkey要搞清楚控制消息传递如何实现我们先要搞清楚所谓的控制消息到底有什么我们最终需要通过单边模式write来实现大批量的数据传输主机写入远端内存的之前需要知道远端内存缓冲区地址和rkey这也就是RDMA文件传输助手中最关键的控制消息。双边模式并不需要提供远端地址和rkey就可以进行通信只需要远端预先发布recv WR我们可以根据这个特点进行元数据交换然后主机根据拿到的元数据进行单边write操作。RDMA 的 send和recv 的工作流程如下:初始化双方打开RDMA设备分配PD、注册MR并获取对应的lkey创建QP、CQ等//建链与初始化staticvoidinitialize_connection(structrdma_cm_id*cm_id){structibv_pd*pdibv_alloc_pd(cm_id-verbs);//分配PDstructibv_comp_channel*channelibv_create_comp_channel(cm_id-verbs);//创建完成事件通道structibv_cq*cqibv_create_cq(cm_id-verbs,1024,NULL,channel,0);//创建CQstructibv_qp_init_attrqp_attr{.send_cqcq,.recv_cqcq,.qp_typeIBV_QPT_RC,.cap{.max_send_wr1024,.max_recv_wr1024,.max_send_sge1,.max_recv_sge1}};rdma_create_qp(cm_id,pd,qp_attr);//创建QPconn_manger_t*conncalloc(1,sizeof(*conn));conn-pdpd;conn-qpcm_id-qp;conn-cqcq;conn-channelchannel;posix_memalign((void**)conn-recv_buffer,4096,CTRL_BUF_SIZE);posix_memalign((void**)conn-send_buffer,4096,CTRL_BUF_SIZE);//注册MRconn-recv_mribv_reg_mr(pd,conn-recv_buffer,CTRL_BUF_SIZE,IBV_ACCESS_LOCAL_WRITE|IBV_ACCESS_REMOTE_WRITE);conn-send_mribv_reg_mr(pd,conn-send_buffer,CTRL_BUF_SIZE,IBV_ACCESS_LOCAL_WRITE|IBV_ACCESS_REMOTE_READ);cm_id-contextconn;}远端预先建构并发布recv WR并将recv WR推入RQ中staticintpost_recv(conn_manger_t*conn){//构建recv WRstructibv_sgesge;memset(sge,0,sizeof(sge));sge.addr(uintptr_t)conn-recv_buffer;sge.lengthCTRL_BUF_SIZE;sge.lkeyconn-recv_mr-lkey;//lkey用于操作本地的MRstructibv_recv_wrrecv_wr,*bad_recv_wrNULL;memset(recv_wr,0,sizeof(recv_wr));recv_wr.wr_id(uintptr_t)conn;recv_wr.sg_listsge;recv_wr.num_sge1;conn-recv_outstanding1;//将recv WR推送到RQif(ibv_post_recv(conn-qp,recv_wr,bad_recv_wr)){conn-recv_outstanding0;perror(ibv_post_recv);return-1;}return0;}说明SGEScatter/Gather Element用于向硬件描述一块内存区域structibv_sge{uint64_taddr;// 内存缓冲区的起始虚拟地址uint32_tlength;// 缓冲区长度字节数uint32_tlkey;// 本地内存密钥由注册MR时获得};本机构建send WR包含控制消息将send WR推入SQ中staticintpost_send(conn_manger_t*conn,uint32_tlength){if(length0||lengthCTRL_BUF_SIZE)return-1;//构建send WRstructibv_sgesge;memset(sge,0,sizeof(sge));sge.addr(uintptr_t)conn-send_buffer;sge.lengthlength;sge.lkeyconn-send_mr-lkey;//lkey操作本地MRstructibv_send_wrsend_wr,*bad_send_wrNULL;memset(send_wr,0,sizeof(send_wr));send_wr.wr_id(uintptr_t)conn;send_wr.opcodeIBV_WR_SEND;//操作码IBV_WR_SENDsend_wr.send_flagsIBV_SEND_SIGNALED;send_wr.sg_listsge;send_wr.num_sge1;conn-send_outstanding1;//将send WR推送到SQif(ibv_post_send(conn-qp,send_wr,bad_send_wr)){conn-send_outstanding0;perror(ibv_post_send);return-1;}returnwait_send_done(conn);}RDMA硬件完成通信产生WC本机和远端轮询CQ回收WCstaticintpoll_cq_batch(conn_manger_t*conn){structibv_wcwcs[POLL_BATCH];intnibv_poll_cq(conn-cq,POLL_BATCH,wcs);//轮询CQ,获取一批WC//遍历检查WC状态for(inti0;in;i){structibv_wc*wcwcs[i];if(wc-status!IBV_WC_SUCCESS){conn-send_outstanding0;conn-recv_outstanding0;conn-write_inflight0;continue;}//操作码对应if(wc-opcodeIBV_WC_RDMA_WRITE){//这个部分是单边write 消费WC用的先不需要管intcredits(int)wc-wr_id;if(credits0)credits1;conn-write_inflight-credits;if(conn-write_inflight0)conn-write_inflight0;}elseif(wc-opcodeIBV_WC_SEND){//WC回收计数清除conn-send_outstanding0;}elseif(wc-opcodeIBV_WC_RECV){//同上conn-recv_outstanding0;}}returnn;}三、文件数据传输我们通过双边模式交换控制消息远端地址、rkey等之后现在主机发送端拥有了足够的信息执行单边write了前面我们已经介绍了双边模式下使用的函数其中许多都可以重复使用比如PD分配与MR的注册、轮询CQ等。单边数据write的过程如下分配 PD注册待传输数据的 MR用 chunks 批量构建send WR将 MR 切成很多个 chunks用SGE向RDMA硬件描述每块 chunk 的内存区域将已经取得的远端地址remote_addr和rkey等写入WR中批量推入SQ多个WR inflight。staticintpost_rdma_file(conn_manger_t*conn){size_toffset0;size_tsizeconn-src_size;uint32_tlkeyconn-src_mr-lkey;//用chunks批量构建WRwhile(offsetsize){//write窗口满了while(conn-write_inflightWR_WINDOW){cq_wait_progress(conn);}// 计算本次分块长度size_tremainsize-offset;uint32_tlen(remainCHUNK_SIZE)?CHUNK_SIZE:(uint32_t)remain;structibv_sgesge{.addr(uint64_t)(uintptr_t)(conn-src_bufoffset),.lengthlen,.lkeylkey};structibv_send_wrsend_wr{.wr_id1,.opcodeIBV_WR_RDMA_WRITE,//操作码是IBV_WR_RDMA_WRITE.send_flagsIBV_SEND_SIGNALED,.sg_listsge,.num_sge1,.wr.rdma{.remote_addrconn-remote_addroffset,.rkeyconn-remote_rkey}};conn-write_inflight;ibv_post_send(conn-qp,send_wr,NULL);offsetlen;}while(conn-write_inflight0){if(cq_wait_progress(conn)0)return-1;}return0;}RDMA硬件完成发送产生WC轮询CQ回收WC//poll_cq_batch() 中处理单边write的分支if(wc-opcodeIBV_WC_RDMA_WRITE){intcredits(int)wc-wr_id;if(credits0)credits1;conn-write_inflight-credits;//inflight的减去完成的WC数目if(conn-write_inflight0)conn-write_inflight0;}四、测试我使用了两台虚拟机使用siwSoft-iWARP 。siw 是 Linux 内核中一个纯软件实现的 RDMA 设备驱动它允许你在标准以太网卡上运行 RDMA 应用无需专用的 RDMA 网卡硬件进行测试以下结果仅供参考测试场景吞吐量结论跨机 perftest~12 MB/s官方工具测 siw 跨机性能上限受限于软件模拟 TCP/IP 协议栈实际传输~9 MiB/s与官方基准同一量级代码实现无明显性能缺陷

相关新闻

2026/9/7 20:45:55

2026防刷投票系统怎么选?5个实用标准,正式评选更公平

2026 年办投票活动,刷票是最影响活动效果的问题,尤其是正式评选,一旦刷票失控,结果就失去公信力,还容易引发争议。判断一个防刷投票系统靠不靠谱,不用懂复杂技术,看 5 个实用标准就行&#xff0…

2026/9/7 20:45:55

rancher v2.6.5 部署rancher-monitor (已监控k8s v1.23.12)

安装说明: rancher需要安装的rancher monitoring和prometheus的node exporter, rancher monitoring用来监控ranhcer里各个pods的运行状态,node exporter则用来监控裸机的运行状态rancher monitoring和prometheus的node exporter,相…

2026/9/7 20:40:54

Python实现多文件夹文件汇总:递归遍历与重名冲突处理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 21:41:08

ComfyUI 新手入门实战:从节点式工作流搭建到 API 批量调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 21:41:08

智慧旅游:景区客流预测与推荐系统技术解析

1. 项目背景与核心价值 景区客流量预测与推荐系统是当前智慧旅游领域的核心应用场景。去年暑期我在某5A级景区实地调研时,亲眼目睹了管理人员面对突发大客流时的手忙脚乱——停车场饱和、检票口排队超2小时、核心景点拥挤度爆表。这种场景正是本项目要解决的核心痛点…

2026/9/7 21:41:08

汽车胶管挤出生产线选型与维护指南

1. 汽车胶管挤出生产线行业现状解析汽车胶管作为连接发动机、变速箱、制动系统等关键部位的重要零部件,其质量直接影响整车的安全性和可靠性。2026年全球汽车胶管市场规模预计将达到380亿美元,年复合增长率约5.2%。在这个背景下,挤出生产线作…

2026/9/7 21:41:08

分布式任务调度高可用架构设计与多语言落地实践

分布式任务调度这件事,说大不大说小不小。我刚入行的时候,所有任务都是在一台机器上跑的,靠crontab搞定一切。后来业务量涨起来,定时任务从几十个涨到几千个,单机那点资源根本扛不住,更别提一台机器挂掉整个…

2026/9/7 21:36:01

Miniconda与Jupyter Notebook环境管理全指南

1. Miniconda与Jupyter Notebook核心价值解析 作为Python生态中最轻量级的发行版,Miniconda在2023年的开发者调研中安装量同比增长47%,而Jupyter Notebook则占据了数据科学领域83%的交互式开发场景。这对黄金组合之所以备受青睐,关键在于解决…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…