DMA 技术是一个 直接内存访问技术。

在传统的linux 内存读写操作都必须经过cpu,读写寻址都是有cpu 完成的, 现在有一中技术 让数据读写完全由网卡自己完成。

这样就必须有硬件支持,及系统必须有DMA 控制器。 DMA 控制器可以完成寻址,和数据传输。

DMA 可以有软件触发,及软中断,也可有硬件触发 及硬中断。

在DMA 系统中 cpu 也不完全解放出来, 当数据来时 触发终端通知DMA 控制其,这是获取数据的程序进入休眠状态。在数据完成时 cpu 在发出中断 恢复app。

那么 DMA 和RDMA 又有什么区别呢?

1. DMA  虽然解放了cpu 但是 他还是不能把数据之节从存储设备copy 到user 层。

硬盘->kernel space->user space->app

这其中就要cpu 参与两次 当数据完全读到kernel 层的 io buffer 时发出中断 然后cpu 把数据copy 到user 层,然后cpu 发出中断app 从睡眠中恢复 读写数据

2. RDMA 则不然 他直接从硬盘把数据读到user 层

硬盘-》user space->app

在这个过程中cpu 就参与一次。

值得注意的是 DMA/RDMA的引入会导致cache 内容和RMA 中不一致的问题, 这里需要特别注意。

下面这篇文章写的比较号:

RDMA技术详解(一):RDMA概述

转载于:https://zhuanlan.zhihu.com/p/55142557

1. DMA和RDMA概念#

1.1 DMA#

DMA(直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与。

传统内存访问需要通过CPU进行数据copy来移动数据,通过CPU将内存中的Buffer1移动到Buffer2中。DMA模式:可以同DMA Engine之间通过硬件将数据从Buffer1移动到Buffer2,而不需要操作系统CPU的参与,大大降低了CPU Copy的开销。

1.2 RDMA#

RDMA是一种概念,在两个或者多个计算机进行通讯的时候使用DMA, 从一个主机的内存直接访问另一个主机的内存。

RDMA是一种host-offload, host-bypass技术,允许应用程序(包括存储)在它们的内存空间之间直接做数据传输。具有RDMA引擎的以太网卡(RNIC)--而不是host--负责管理源和目标之间的可靠连接。使用RNIC的应用程序之间使用专注的QP和CQ进行通讯:

  1. 每一个应用程序可以有很多QP和CQ
  2. 每一个QP包括一个SQ和RQ
  3. 每一个CQ可以跟多个SQ或者RQ相关联

2. RDMA的优势#

传统的TCP/IP技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制移动,给服务器的CPU和内存造成了沉重负担。尤其是网络带宽、处理器速度与内存带宽三者的严重"不匹配性",更加剧了网络延迟效应。

RDMA是一种新的直接内存访问技术,RDMA让计算机可以直接存取其他计算机的内存,而不需要经过处理器的处理。RDMA将数据从一个系统快速移动到远程系统的内存中,而不对操作系统造成任何影响。

在实现上,RDMA实际上是一种智能网卡与软件架构充分优化的远端内存直接高速访问技术,通过将RDMA协议固化于硬件(即网卡)上,以及支持Zero-copy和Kernel bypass这两种途径来达到其高性能的远程直接数据存取的目标。 使用RDMA的优势如下:

  • 零拷贝(Zero-copy) - 应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。
  • 内核旁路(Kernel bypass) - 应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。
  • 不需要CPU干预(No CPU involvement) - 应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。
  • 消息基于事务(Message based transactions) - 数据被处理为离散消息而不是流,消除了应用程序将流切割为不同消息/事务的需求。
  • 支持分散/聚合条目(Scatter/gather entries support) - RDMA原生态支持分散/聚合。也就是说,读取多个内存缓冲区然后作为一个流发出去或者接收一个流然后写入到多个内存缓冲区里去。

在具体的远程内存读写中,RDMA操作用于读写操作的远程虚拟内存地址包含在RDMA消息中传送,远程应用程序要做的只是在其本地网卡中注册相应的内存缓冲区。远程节点的CPU除在连接建立、注册调用等之外,在整个RDMA数据传输过程中并不提供服务,因此没有带来任何负载。

3. RDMA 三种不同的硬件实现#

RDMA作为一种host-offload, host-bypass技术,使低延迟、高带宽的直接的内存到内存的数据通信成为了可能。目前支持RDMA的网络协议有:

  1. InfiniBand(IB): 从一开始就支持RDMA的新一代网络协议。由于这是一种新的网络技术,因此需要支持该技术的网卡和交换机。
  2. RDMA过融合以太网(RoCE): 即RDMA over Ethernet, 允许通过以太网执行RDMA的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡必须是支持RoCE的特殊的NIC。
  3. 互联网广域RDMA协议(iWARP): 即RDMA over TCP, 允许通过TCP执行RDMA的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡要求是支持iWARP(如果使用CPU offload的话)的NIC。否则,所有iWARP栈都可以在软件中实现,但是失去了大部分的RDMA性能优势。

在三种主流的RDMA技术中,可以划分为两大阵营。一个是IB技术, 另一个是支持RDMA的以太网技术(RoCE和iWARP)。其中, IBTA力挺的技术自然是IB和RoCE, Mellanox公司(一个以色列人搞的小公司)是这方面的急先锋。而iWARP则是IEEE/IETF力挺的技术,主要是Chelsio公司在推进。RoCE和iWARP的争论,请参考Mellanox和Chelsio这两家公司发布的白皮书。

在存储领域,支持RDMA的技术早就存在,比如SRP(SCSI RDMA Protocol)和iSER(iSCSI Extensions for RDMA)。 如今兴起的NVMe over Fabrics如果使用的不是FC网络的话,本质上就是NVMe over RDMA。 换句话说,NVMe over InfiniBand, NVMe over RoCE和NVMe over iWARP都是NVMe over RDMA。

4. RDMA基本术语#

4.1 Fabric#

A local-area RDMA network is usually referred to as a fabric.

所谓Fabric,就是支持RDMA的局域网(LAN)。

4.2 CA(Channel Adapter)#

A channel adapter is the hardware component that connects a system to the fabric.

CA是Channel Adapter(通道适配器)的缩写。那么,CA就是将系统连接到Fabric的硬件组件。 在IBTA中,一个CA就是IB子网中的一个终端结点(End Node)。分为两种类型,一种是HCA, 另一种叫做TCA, 它们合称为xCA。其中, HCA(Host Channel Adapter)是支持"verbs"接口的CA, TCA(Target Channel Adapter)可以理解为"weak CA", 不需要像HCA一样支持很多功能。 而在IEEE/IETF中,CA的概念被实体化为RNIC(RDMA Network Interface Card), iWARP就把一个CA称之为一个RNIC。

简言之,在IBTA阵营中,CA即HCA或TCA; 而在iWARP阵营中,CA就是RNIC。 总之,无论是HCA、 TCA还是RNIC,它们都是CA, 它们的基本功能本质上都是生产或消费数据包(packet)

4.3 Verbs#

在RDMA的持续演进中,有一个组织叫做OpenFabric Alliance所做的贡献可谓功不可没。 Verbs这个词不好翻译,大致可以理解为访问RDMA硬件的“一组标准动作”。 每一个Verb可以理解为一个Function。

5. 核心概念#

5.1 Memory Registration(MR) | 内存注册#

RDMA 就是用来对内存进行数据传输。那么怎样才能对内存进行传输,很简单,注册。 因为RDMA硬件对用来做数据传输的内存是有特殊要求的。

  • 在数据传输过程中,应用程序不能修改数据所在的内存。
  • 操作系统不能对数据所在的内存进行page out操作 -- 物理地址和虚拟地址的映射必须是固定不变的。

注意无论是DMA或者RDMA都要求物理地址连续,这是由DMA引擎所决定的。 那么怎么进行内存注册呢?

  • 创建两个key (local和remote)指向需要操作的内存区域
  • 注册的keys是数据传输请求的一部分

注册一个Memory Region之后,这个时候这个Memory Region也就有了它自己的属性:

  • context : RDMA操作上下文
  • addr : MR被注册的Buffer地址
  • length : MR被注册的Buffer长度
  • lkey:MR被注册的本地key
  • rkey:MR被注册的远程key

对Memrory Registration:Memory Registration只是RDMA中对内存保护的一种措施,只有将要操作的内存注册到RDMA Memory Region中,这快操作的内存就交给RDMA 保护域来操作了。这个时候我们就可以对这快内存进行操作,至于操作的起始地址、操作Buffer的长度,可以根据程序的具体需求进行操作。我们只要保证接受方的Buffer 接受的长度大于等于发送的Buffer长度。

5.2 Queues | 队列#

RDMA一共支持三种队列,发送队列(SQ)和接收队列(RQ),完成队列(CQ)。其中,SQ和RQ通常成对创建,被称为Queue Pairs(QP)。

RDMA是基于消息的传输协议,数据传输都是异步操作。 RDMA操作其实很简单,可以理解为:

  1. Host提交工作请求(WR)到工作队列(WQ): 工作队列包括发送队列(SQ)和接收队列(RQ)。工作队列的每一个元素叫做WQE, 也就是WR。
  2. Host从完成队列(CQ)中获取工作完成(WC): 完成队列里的每一个叫做CQE, 也就是WC。
  3. 具有RDMA引擎的硬件(hardware)就是一个队列元素处理器。 RDMA硬件不断地从工作队列(WQ)中去取工作请求(WR)来执行,执行完了就给完成队列(CQ)中放置工作完成(WC)。从生产者-消费者的角度理解就是:
  4. Host生产WR, 把WR放到WQ中去
  5. RDMA硬件消费WR
  6. RDMA硬件生产WC, 把WC放到CQ中去
  7. Host消费WC

6. RDMA数据传输#

6.1 RDMA Send | RDMA发送(/接收)操作 (Send/Recv)#

跟TCP/IP的send/recv是类似的,不同的是RDMA是基于消息的数据传输协议(而不是基于字节流的传输协议),所有数据包的组装都在RDMA硬件上完成的,也就是说OSI模型中的下面4层(传输层,网络层,数据链路层,物理层)都在RDMA硬件上完成。

6.2 RDMA Read | RDMA读操作 (Pull)#

RDMA读操作本质上就是Pull操作, 把远程系统内存里的数据拉回到本地系统的内存里。

6.3 RDMA Write | RDMA写操作 (Push)#

RDMA写操作本质上就是Push操作,把本地系统内存里的数据推送到远程系统的内存里。

6.4 RDMA Write with Immediate Data | 支持立即数的RDMA写操作#

支持立即数的RDMA写操作本质上就是给远程系统Push(推送)带外(OOB)数据, 这跟TCP里的带外数据是类似的。

可选地,immediate 4字节值可以与数据缓冲器一起发送。 该值作为接收通知的一部分呈现给接收者,并且不包含在数据缓冲器中。

编辑推荐:
· 利用 PGO 提升 .NET 程序性能
· 我给鸿星尔克写了一个720°看鞋展厅
· 带团队后的日常(三)
· 你为什么不想向上汇报?
· 传统.NET 4.x应用容器化体验(4)

最新新闻
· 比起上市,小红书更应去去滤镜
· 买临期食品的年轻人,在向“吃喝内卷”低头
· 他们到虾米音乐“坟前”报喜
· 揭秘“短视频创业”:一年亏50万,一个人就是一支团队
· 小米与华为的十字路口
» 更多新闻...

Copyright © 2021 Guo·Rulai
Powered by .NET 5.0 on Kubernetes & Theme Silence v3.0.0

DMA RDMA 技术详解相关推荐

  1. 【RDMA】RDMA技术详解(二):Send Receive操作

    原文:https://blog.csdn.net/qq_21125183/article/details/86525012 英文:https://zcopy.wordpress.com/2010/10 ...

  2. RDMA技术详解——RDMA常见概念

    Fabric A local-area RDMA network is usually referred to as a fabric. 所谓Fabric,就是支持RDMA的局域网(LAN). CA( ...

  3. RDMA技术详解(一):RDMA概述

    1. DMA和RDMA概念 1.1 DMA DMA(直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与. 传统内存访问需要通过CPU进行数据copy ...

  4. RDMA技术详解——RDMA核心概念

    1.1 Memory Registration(MR) | 内存注册 RDMA 就是用来对内存进行数据传输.那么怎样才能对内存进行传输,很简单,注册. 因为RDMA硬件对用来做数据传输的内存是有特殊要 ...

  5. RDMA技术详解——原理和三种实现方式

    RDMA作为一种host-offload, host-bypass技术,使低延迟.高带宽的直接的内存到内存的数据通信成为了可能.目前支持RDMA的网络协议有: 1.InfiniBand(IB): 从一 ...

  6. RDMA技术详解——DMA和RDMA概念

    1.1 DMA DMA(Direct Memory Access,直接内存访问)是一种能力,允许在计算机主板上的设备直接把数据发送到内存中去,数据搬运不需要CPU的参与.如下图所示 红线部分为传统内存 ...

  7. RDMA技术详解(三):理解RDMA Scatter Gather List

    1. 前言 在使用RDMA操作之前,我们需要了解一些RDMA API中的一些需要的值.其中在ibv_send_wr我们需要一个sg_list的数组,sg_list是用来存放ibv_sge元素,那么什么 ...

  8. RDMA技术详解(二):RDMA Send Receive操作

    1. 前言 RDMA指的是远程直接内存访问,这是一种通过网络在两个应用程序之间搬运缓冲区里的数据的方法.RDMA与传统的网络接口不同,因为它绕过了操作系统.这允许实现了RDMA的程序具有如下特点: 绝 ...

  9. 【RDMA】技术详解(一):RDMA概述

    目录 0.前言 一.技术背景 1 传统的 TCP/IP 网络通信的弊端 2 新的网络通信技术(TOE and RDMA) 2.1 TOE (TCP/IP协议处理工作从CPU转移到网卡) 2.2 RDM ...

最新文章

  1. Java实用教程 课堂测试(2021C++补考题目)
  2. 信息与计算机科学好学吗,计算机科学与技术好学吗?
  3. Oracle bbed 五个 实用示例
  4. 711 发送请求失败_会不会存在不失败的代理IP?
  5. Java——UPD输出及优化再优化
  6. 正在锁定计算机 win7转圈圈打不开,Win7网络连接图标一直转圈的原因和解决方法...
  7. 卸载nginx php mysql_ubuntu16.04彻底删除nginx+php
  8. 使用using关键字来自动清除对象资源
  9. x86汇编语言复习笔记
  10. mysql的读写分离工具_mysql 读写分离工具
  11. 直播网站源码,输入框中显示小图标
  12. steam一键授权工具_超实用小工具!一键将PC其它平台的游戏导入Steam
  13. Java简单代码-用*号拼三角形
  14. 有赞云支付php接口,Erphpdown wordpress插件集成有赞云支付的接口申请方法
  15. 虚拟机怎样使用代理服务器上网,VMware虚拟机使用NAT模式上网的方法
  16. d435i 深度相机运行踩坑大合集
  17. Creator打android包时报Could not resolve all files for configuration ':jcore-react-native:lintClassPath'异
  18. Java 8之函数式编程(Function、Consumer、Supplier、Predicate)
  19. 3518E EMMC驱动
  20. Dusk network 生态图

热门文章

  1. [机缘参悟-72]:深度思考-人生自省的四重境界:不觉、自觉、觉他、圆满
  2. Leetcode——唯唯诺诺对并查集的初次相见
  3. 《Android软件安全权威指南》原生程序分析 阅读笔记
  4. vscode 实时运行代码插件 Quokka
  5. Win7安装hp1020打印机方法
  6. MySQL查询与数据库设计 #万能公式 #思维导图 #MySQL查询 #数据库设计规范 #第二部分
  7. 基于PP-ShiTu的商品识别系统
  8. 2021-08-31 multisim14 电感电容滤波器的的幅频特性,输入方波,输出正弦波
  9. 工作用哪个邮箱好用?好用的办公邮箱让你放假无烦恼
  10. windows10下安装Box2D