RDMA学习路线总结

本博客分享了学习RDMA技术的经验和资料。介绍了RDMA全称远程直接数据存取及其好处,如零拷贝、低CPU占有率等。还提及编程环境,推荐了编程库如MLNX_OFED 4.0,给出编程参考手册、相关资料代码参考、网络课程培训及迈络思硬件配置工具的信息。

转自: https://my.oschina.net/SysuHuyh5LoveHqq/blog/842767

本博客仅作为分享本人学习rdma技术过程中一些经验和资料分享,若有错误之处,还请指教。如有侵犯版权问题,请立即通知本人,本人立即删除.特此声明!

 简介--什么是rdma

    RDMA(Remote Direct Memory Access)技术全称远程直接数据存取。

    RDMA (Remote DMA) is the ability of accessing (i.e. reading from or writing to) memory on a remote machine withoutinterrupting the processing of the CPU(s) on that system.

RDMA的好处与优势:

     1、零拷贝(zero-copy) RDMA transfers data directly from user virtual memory on one node to user virtual memory on another node, tcp copies into/out of system buffers on both nodes.

    2、CPU占有率( Low CPU utilization) 鉴于zero-copy的存在,使得机器的cpu占有率下降,让cpu更多的执行其他逻辑计算指令。

     3、异步事件(Asynchronous operation) rdma在io操作过程中并不阻塞相关线程,tcp/ip确是阻塞方式(此处所说的阻塞,是指tcp将数据发送到内核缓冲区是阻塞的,不同于tcp的noblocking的概念)

          RDMA是asynchronous的,即no blocking during a transfer, which – starts when metadata added to “work queue” – finishes when status available in “completion queue”

       tcp/ip中是synchronous的,即send(), recv() block until data copied – O_NONBLOCK, MSG_DONTWAIT are not asynchronous,they are “try” and get error

     4、Message boundaties preserved. rdma是基于消息模式的,本身保留了消息边界,不同于tcp/ip流传输方式,需要做拆包解包操作。 

 

rdma对于高性能的网络通讯来说,优势很多,但学习成本以及相关推广成本也是蛮高的,后面分享下本人摸索过程中的一些资料。

编程环境

    网络环境分为一下几种: InfiniBand环境,iWarp(internet Wide Area RMDA Protocol)环境, RoCE(RDMA over Converged Ethernet)环境,SoftRoCE环境。

    在没有硬件设备的支持下,我们可以搭一套软环境来熟悉相关rdma编程的知识点,至于如何搭建一套SoftRoCE环境,请参见本人和小伙伴通过摸索亲测有效的博客

https://my.oschina.net/SysuHuyh5LoveHqq/blog/798275

 

推荐编程库

    MLNX_OFED 4.0 , 一般来说,就本人个人经验来看,rdma编程最好还是使用硬件厂商的相关库,一般IB网络我们使用Mellanox的硬件(网卡,交换机等等),因此编程所用驱动、代码库还是推荐迈络思OFED,目前为止4.0是最新版本,详情参考:

http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux_sw_drivers ,

    除了安装版本,最好下载相关源码,里面有相关参考demo供大家学习理解rdma编程。

    主要熟悉libibverbs和librdmacm库,其中librdmacm在libibverbs上封装了一层,个人推荐直接使用libibverbs作为初期学习之用,这样更好了解整个事件的来龙去脉。

 

编程参考手册

    RDMA Aware Networks Programming User Manual 1.7, 目前最新版就是1.7版本,此手册可研读多次,对基本概念性了解很有帮助

http://www.mellanox.com/related-docs/prod_software/RDMA_Aware_Programming_user_manual.pdf

 

相关资料和代码参考

www.mellanox.com/

http://www.rdmamojo.com/

samplecode: https://github.com/tarickb/the-geek-in-the-corner 

代码解析https://thegeekinthecorner.wordpress.com/page/2/

 

rdma网络课程培训

迈络思网关给出了rdma网络编程培训的相关课程,可以作为相关参考http://academy.mellanox.com/en/

 

迈络思相关硬件的配置工具

mellanox官网给出的参考资料

详情请见: http://www.mellanox.com/page/configuration-tools

 

作者:胡宇辉,某券商软件开发工程师,主要从事后台高性能服务端编程,分布式系统设计。使用语言C/C++, Erlang,Golang,了解ELK, open-falcon, RDMA等相关知识点。

### RDMA驱动开发教程 RDMA(Remote Direct Memory Access)驱动开发涉及对硬件和内核模块的深入理解。为了实现高效的RDMA通信,开发者需要掌握网络协议栈、设备驱动程序以及操作系统内存管理机制等知识。 #### 1. 开发环境搭建 在开始学习RDMA驱动开发之前,首先需要准备好一个支持RDMA的环境。如果没有实际的RDMA网卡或InfiniBand卡,可以使用软件模拟工具如Soft-iWARP来构建一个虚拟的RDMA环境[^1]。Soft-iWARP是一个开源项目,可以在普通的以太网上提供类似RDMA的功能。你可以从GitHub上克隆该项目并按照相关教程进行安装配置。 #### 2. 学习资料与社区资源 - **官方文档**:OpenFabrics Alliance提供了关于RDMA技术的标准定义和技术细节,是了解底层原理的重要来源[^3]。 - **博客文章**:例如RDMAmojo这样的博客由Dotan Barak维护,专门讨论RDMA技术和编程实践,适合进阶学习者获取实用信息。 - **学术论文**:通过Google Scholar搜索可以获得大量有关RDMA性能分析、应用场景的研究成果[^3]。这些文献通常包含最新的研究成果和技术趋势。 - **书籍**:虽然直接针对RDMA驱动开发的书籍不多,但《创新者的困境》中对于颠覆性技术的发展路径有深刻见解,有助于理解RDMA如何逐步渗透到不同领域中去[^2]。 #### 3. 编程接口与API 熟悉RDMA编程接口是关键一步。Linux系统下主要依赖于libibverbs库提供的API来进行RDMA操作。这个库允许应用程序直接访问远程主机内存而无需CPU干预,从而减少延迟并提高吞吐量。此外,还需要了解verbs API的具体用法,包括创建保护域(Protection Domain)、完成队列(Completion Queue)等基本概念。 ```c #include <infiniband/verbs.h> struct ibv_device **dev_list; struct ibv_context *context; // 获取所有可用的IB设备 dev_list = ibv_get_device_list(NULL); if (!dev_list) { perror("Failed to get IB devices list"); exit(EXIT_FAILURE); } // 打开第一个找到的设备 context = ibv_open_device(dev_list[0]); if (!context) { fprintf(stderr, "Couldn't open device %s\n", ibv_get_device_name(dev_list[0])); exit(EXIT_FAILURE); } ``` 这段代码展示了如何获取本地机器上的InfiniBand设备列表,并尝试打开第一个找到的设备。这是初始化任何基于InfiniBand的应用程序所必需的第一步。 #### 4. 驱动开发基础 编写RDMA驱动时,必须考虑以下几个方面: - **内存注册**:为了能够执行零拷贝传输,用户空间缓冲区必须被注册到内核中,这样DMA引擎才能安全地访问它们。 - **连接管理**:建立和维护端点之间的可靠连接至关重要。这可能涉及到使用RoCE (RDMA over Converged Ethernet) 或者InfiniBand子层的服务。 - **错误处理**:设计健壮的错误恢复机制以应对网络故障或其他异常情况。 ### 原理详解 RDMA的核心在于它能够在两个节点之间直接读写对方内存中的数据而不经过CPU参与,这意味着减少了数据传输过程中的延迟和CPU开销。这种能力使得RDMA特别适用于高性能计算(HPC)、云计算及大规模分布式存储等领域。具体来说,当发送方想要向接收方传输数据时,它会发送一条包含目标地址和长度的消息给接收方的NIC(Network Interface Card),然后NIC就会自动将数据从发送方的内存复制到接收方指定的位置,全程都不需要调用操作系统内核或者中断CPU处理流程。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值