文章目录

  • 1.RDMA概念
  • 2.RMDA与Socket
    • 2.1传统的TCP/IP通信
    • 2.2TCP/IP存在的问题
  • 3.RDMA的特点
    • 3.1CPU offload
    • 3.2kernel bypass
    • 3.3zero copy
    • 3.4异步接口
  • 4.RDMA通信协议
    • InfiniBand
    • RoCE
    • iWARP
  • 5.RDMA编程概述
    • 5.1传输操作
    • 5.2传输模式
    • 5.3相关概念
    • 5.4典型实例
  • 6.RDMA通信过程
    • 6.1单向通信-读Read
    • 6.2单向通信-写Write
    • 6.3双向通信-Send\Recv

1.RDMA概念

  RDMA(Remote Direct Memory Access)在概念上是相对于DMA而言的。在DMA技术中,外部设备(PCIe设备)能够绕过CPU直接访问主机的系统主存;而RDMA则指外部设备能够绕过CPU,不仅可以访问本地主机的主存,它还可以访问另一台远端主机上用户态的系统主存。RDMA

2.RMDA与Socket

RDMA通信示意图:

Socket通信示意图:

  在传统的套接字网络中,应用程序向操作系统申请网络资源时,要通过特定的API来管理程序的行为。但是RDMA仅仅使用操作系统建立一个通道,然后就可以再不需要操作系统干预的情况下,应用程序之间既要能进行直接的消息传递。

2.1传统的TCP/IP通信

  TCP/IP/Ethernet 是一种面向字节流的传输方式,信息以字节的形式在套接字应用程序之间传递。数据发送方要将数据从用户空间Buffer复制到内核空间的Socket Buffer中。然后在内核空间中添加数据报头,进行数据封装。通过一系列多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)、以及互联网控制消息协议(ICMP)等。经历如此多个步骤,数据才能被Push到NIC网卡中的Buffer进行网络传输。在消息接收方,从远程主机发送来的数据包,要先将其从NIC Buffer拷贝至Socket Buffer,然后经过一系列的多层网络协议对数据包进行解析,解析后的数据被复制到相应的用户空间应用程序的Buffer中。此时,再进行系统上下文切换,用户应用程序才被调用。以上就是传统TCP/IP通信的工作流程。

2.2TCP/IP存在的问题

  传统TCP/IP通信存在的主要问题就是I/O瓶颈问题。在高速网络环境下与网络I/O相关的主机处理的高开销(数据移动操作和复制操作)限制了机器之间的传输带宽。具体来说,传统的TCP/IP网络通信是通过内核发送消息。通过内核来传输消息这种机制会导致很低的性能和很低的灵活性。性能低下的主要原因是由于网络通信通过内核传递,需要在内核中频繁进行协议封装和解封操作,造成很大的数据移动和数据复制开销。很低的灵活性是因为网络通信协议在内核中进行处理,这种方式很难支持新的网络协议和新的消息通信协议以及发送和接收接口。

3.RDMA的特点

  为了消除传统网络通信带给计算任务的瓶颈,我们希望更快和更轻量级的网络通信,由此提出了RDMA技术。RDMA利用栈旁路和零拷贝技术提供了低延迟的特性,同时减少了CPU占用,减少了内存带宽瓶颈,提供了很高的带宽利用率。RDMA提供了给基于IO的通道,这种通道允许一个应用程序通过RDMA设备对远程的虚拟内存进行直接的读写。

RDMA技术的设计主要有以下几个特点:

3.1CPU offload

   无需CPU干预,应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。

3.2kernel bypass

  内核旁路指的是,应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。

3.3zero copy

  零拷贝主要的任务就是避免CPU将数据从一块存储拷贝到另外一块存储,在TCP/IP通信中,数据在主机之间的传输需要频繁进行拷贝操作(UserSpace Buffer、Socket Buffer、NIC Buffer),这些操作无疑增加了传输延迟。而RDMA具有零拷贝的特点。RDMA技术非常重要的一点是,每个应用程序都能直接访问集群中的设备的虚拟内存,这意味着应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下,数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。

3.4异步接口

  在RDMA中,提供的所有接口都是异步的通信接口,这样在编程的时候,可以更加便利的实现计算和通信的分离。

4.RDMA通信协议

  目前,有三种支持RDMA的通信技术:IB(InfiniBand)、以太网RoCE(RDMA over Converged Ethernet)、以太网iWARP(internet Wide Area RDMA Protocal)。这三种技术都可以使用同一套API来使用,但它们有着不同的物理层和链路层。

InfiniBand

  InfiniBand(IB)是一种服务器和存储器的互联技术,它具有高速、低延迟、低CPU负载、高效率和可扩展的特性。InfiniBand的关键特性之一是它天然地支持远程直接内存访问(RDMA)。InfiniBand能够让服务器与服务器之间、服务器与存储设备之间的数据传输不需要主机CPU的参与。
  InfiniBand使用I/O通道进行数据传输,每个I/O通道提供虚拟的NIC或HCA语义。InfiniBand提供了多种技术方案,每个端口的速度可以有10GB/s、40GB/s、56GB/s、100GB/s,截止目前已经达到了200GB/s。InfiniBand使用同轴电缆和光纤进行连接。

RoCE

  RDMA首先从InfiniBand规范和产品里引入工业界,但是目前在企业界部署着大量基于以太网的产品,因此IBTA规范组织又定义了一套字符规范,使得RDMA不仅可以在infiniBand网络上运行,同时也可以在以太网上运行。
  RoCE是基于以太网(Ethernet)的RDMA技术标准,它也是由IBTA组织指定的。RoCE为以太网提供了RDMA语义,并不需要复杂低效的TCP传输(IWARP需要)。
  RoCE是现在最有效的以太网低延迟方案。它消耗很少的CPU负载,在数据中心桥接以太网中利用优先流控制(PFC)来达到网络的无损连接。
  RoCE 有两个版本,RoCE v1是一种链路层协议,允许在同一个广播域下的任意两台主机直接访问。RoCE v2是一种Internet层协议,即可以实现路由功能。虽然RoCE协议这些好处都是基于融合以太网的特性,但是RoCE协议也可以使用在传统以太网网络或者非融合以太网络中。

iWARP

  iWARP也是一个允许在TCP上执行RDMA的网络协议。IB和RoCE中存在的功能在iWARP中不受支持。它支持在标准以太网基础设施(交换机)上使用RDMA

5.RDMA编程概述

5.1传输操作

  RDMA有两种基本操作,包括Memory verbs和Messaging verbs。

  • Memory verbs:包括read、write和atomic操作。
    - RDMA Read:从远程主机读取部分内存。调用者指定远程虚拟地址,像本地内存地址一样用来拷贝。在执行 RDMA 读操作之前,远程主机必须提供适当的权限来访问它的内存。一旦权限设置完成, RDMA 读操作就可以在对远程主机没有任何通知的条件下执行。不管是 RDMA 读还是 RDMA 写,远程主机都不会意识到操作正在执行 (除了权限和相关资源的准备操作)。
    - RDMA Write:与RDMA Read类似,只是数据写到远端主机中。RDMA写操作在执行时不通知远程主机。然而带即时数的RDMA写操作会将即时数通知给远程主机。
    - RDMA Atomic:包括原子取、原子加、原子比较和原子交换,属于RDMA原子操作的扩展。
  • Messaging verbs:包括send和receive操作。
    - RDMA Send:发送操作允许你把数据发送到远程 QP 的接收队列里。接收端必须已经事先注册好了用来接收数据的缓冲 区。发送者无法控制数据在远程主机中的放置位置。可选择是否使用即时数,一个4位的即时数可以和数据缓冲一起被传送。这个即时数发送到接收端是作为接收的通知,不包含在数据缓冲之中。
    - RDMA Receive:这是与发送操作相对应的操作。接收主机被告知接收到数据缓冲,还可能附带一个即时数。接收端应用 程序负责接收缓冲区的维护和发布。

5.2传输模式

  按照连接和可靠两个标准,可以划分出下图四种不同的传输模式:

  • 可靠连接(RC)
    - 一个QP只和另一个QP相连,消息通过一个QP的发送队列可靠地传输到另一个QP的接收队列。数据包按序交付,RC连接很类似于TCP连接。
  • 不可靠连接(UC)
    - 一个QP只和另一个QP相连,连接是不可靠的,所以数据包可能有丢失。传输层出错的消息不会进行重传,错误处理必须由高层的协议来进行。
  • 不可靠数据报(UD)
    - 一个 QP 可以和其它任意的 UD QP 进行数据传输和单包数据的接收。不保证按序性和交付性。交付的数据包可能被接收端丢弃。支持多播消息(一对多)。UD连接很类似于UDP连接。
      每种模式中可用的操作如下表所示:

5.3相关概念

  在RDMA通信的过程中,有诸多需要理解的概念,例如QP队列对、内存注册等。下面我们来着重介绍一下RDMA通信涉及到了操作和概念。

  • 1.发送请求(SR)

    • SR定义了数据的发送量、从哪里、发送方式、是否通过 RDMA、到哪里。 结构 ibv_send_wr 用来描述 SR。
  • 2.接收请求(RR)
    • RR 定义用来放置通过RDMA 操作接收到的数据的缓冲区。如没有定义缓冲区,并且有个传输者尝试执行一个发送操作或者一个带即时数的 RDMA写操作,那么接收者将会发出接收未就绪的错误(RNR)。结构 ibv_recv_wr用来描述 RR。
  • 3.完成队列(CQ)
    • (CQ)完成队列包含了发送到工作队列(WQ)中已完成的工作请求(WR)。每次完成表示一个特定的 WR 执行完毕(包括成功完成的 WR 和不成功完成的 WR)。完成队列是一个用来告知应用程序已经结束的工作请求的信息(状态、操作码、大小、来源)的机制。
    • CQ有n个完成队列实体(CQE)。CQE的数量在CQ创建时指定。当一个CQE被轮询到,他就从CQ中被删除。CQ是一个CQE的先进先出(FIFO)队列。CQ能服务于发送队列、接收队列或者同时服务于这两种队列。多个不同QP中的工作请求(WQ)可联系到同一个CQ上。结构ibv_cq用来描述CQ。
  • 4.内存注册(MR)
    • 内存注册机制允许应用程序申请一些连续的虚拟内存或者连续的物理内存空间,将这些内存空间提供给网络适配器作为虚拟的连续缓冲区,缓冲区使用虚拟地址。内存注册进程锁定了内存页。为了防止页被替换出去,同时保持物理和虚拟内存的映射。在注册期间,操作系统检查被注册块的许可。注册进程将虚拟地址与物理地址的映射表写入网络适配器。在注册内存时,对应内存区域的权限会被设定。权限包括本地写、远程读、远程写、原子操作、绑定。
    • 每个内存注册(MR)有一个远程的和一个本地的标志(r_key,l_key)。本地标志被本地的 HCA 用来访问本地内存,例如在接收数据操作的期间。远程标志提供给远程 HCA 用来在 RDMA 操作期间允许远程进程访问本地的系统内存。同一内存缓冲区可以被多次注册(甚至设置不同的操作权限),并且每次注册都会生成不同的标志。结构ibv_mr用来描述内存注册。
  • 5.内存窗口(MW)
    • 内存窗口使应用程序对来自远程对本地的内存访问有更灵活的控制。内存窗口作用于以下场景:1)动态地授予和回收已注册缓冲区的远程访问权限,这种方式相较于将缓冲区取消注册、再注册或者重注册,有更低的性能损耗代价。2)想为不同的远程代理授予不同的远程访问方式,或者在一个已注册的缓冲区中不同范围授予哪些权限。内存窗口和内存注册之间的关联操作叫做绑定。不同的MW可以做用于同一个MR,即使有不同的访问权限。
  • 6.地址向量(Address Vector)
    • 地址向量用来描述本地节点到远程节点的路由。在QP的每个UC/RC中,都有一个地址向量存在于QP的上下文中。在UD的QP中,每个提交的发送请求(SR)中都应该定义地址向量。结构ibv_ah用来描述地址向量。
  • 7.全局路由头部(GRH)
    • GRH用于子网之间的路由。当用到RoCE时,GRH用于子网内部的路由,并且是强制使用的,强制使用GRH是为了保证应用程序即支持IB又支持RoCE。当全局路由用在给予UD的QP时,在接受缓冲区的前40自己会包含有一个GRH。这个区域撞门存储全局路由信息,为了回应接收到的数据包,会产生一个合适的地址向量。如果向量用在UD中,接收请求RR应该总是有额外的40字节用来GRH。结构ibv_grh用来描述GRH。
  • 8.保护域(PD)
    • 保护域是一种集合,它的内部元素只能与集合内部的其它元素相互作用。这些元素可以是AH、QP、MR、和SRQ。保护域用于QP与内存注册和内存窗口相关联,这是一种授权和管理网络适配器对主机系统内存的访问。PD也用于将给予不可靠数据报(UD)的QP关联到地址处理(AH),这是一种对UD目的端的访问控制。

5.4典型实例

  一个典型的应用程序结构如下:

  • 1.获取设备列表:首先必须检查得到本机可用的IB设备列表。列表中的每个设备都包含一个名字和GUID。
  • 2.打开要请求的设备:遍历设备列表,通过设备的GUID或者名字选择并打开它。
  • 3.查询设备的工作能力:设备的工作能力能使用户了解已打开设备支持的特性和能力。
  • 4.分配保护域以及您的资源:保护域(PD)允许用户限制哪些组件只能相互交互。这个组件可以是AH、QP、MR、MW、和SRQ。
  • 5.注册一个内存区域:VPI仅适用于已注册的内存。进程的虚拟空间中任何有效的内存缓冲区都可以进行注册。在注册过程中,用户设置内存权限并接收本地和远程秘钥(lkey,rkey),稍后将使用这些秘钥来引用此内存缓冲区。
  • 6.创建完成队列:一个CQ包含完成的工作请求(WR)。每个WR将生成放置在CQ中的完成队列实体CQE。CQE将制定WR是否成功完成。
  • 7.创建队列对(QP):创建QP还将创建关联的发送队列和接收队列 。
  • 8.提出QP:创建的QP仍无法使用,直到它转换为几个状态,最终进入Ready To Send(RTS)。者提供了QP用于 发送/接收数据所需的信息。
  • 9.发布工作请求并poll完成:使用创建的QP进行通信。
  • 10.清理:按照创建前述对象的相反顺序销毁对象:删除QP,删除CQ,取消注册MR,接触分配PD,关闭设备。

6.RDMA通信过程

  为了执行 RDMA 操作,首选需要建立与远程主机的连接和适当的认证。实现这些的机制是队列对(QP) 。与标准的 IP 协议栈类似,一个 QP 大概等同于一个接字(socket)。 QP 需要在连接两端进行初始化。 连接管理器(CM)用来在 QP 建立之前进行 QP 信息的交换。一旦一个 QP 建立起来, verbs API 就可以用来执行 RDMA 读/写和原子操作。与套接字的读/写类似的连续收/发操作也能执行。RDMA的操作过程大致如下:

  • 当一个应用程执行度或者写请求时,不执行任何数据复制,再不需要任何内核参与的条件下,RDMA请求从用户空间中的应用发送到本地NIC网卡。
  • NIC读取缓冲区的内容,并通过网络传输到远程NIC。
  • 在网络上传输的RDMA信息包括虚拟地址内存钥匙数据本身。请求既可以完全在用户空间中处理,又或者在应用一直睡眠到请求完成时的情况下通过系统级中断处理。RDMA操作使应用可以从一个远程应用的内存中读取数据或向这个内存中写数据。
  • 目标NIC确认内存钥匙,直接将数据写入应用缓存中,用于操作的远程虚拟内存地址包含在RDMA信息中。

  在RDMA操作中,Read/Write是单边操作,秩序本地端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或写都通过RDMA在RNIC与应用Buffer之间完成,再由远端RNIC封装成消息返回到本地端。Send/Receive是双边操作,即必须要远端的应用感知参与才能完成收发,在实际中,Send/Receive多用于连接控制类报文,而数据报文是通过Read/Write来完成的。

6.1单向通信-读Read

  • 首先A、B建立连接,QP已经创建并初始化。
  • 数据被存档在B的buffer,地址为VB,注意VB是提前注册到B的RNIC,并且它是一个Memory Region,并拿到返回的local key,相当于RDMA操作这块buffer的权限。
  • B把数据地址VB,key封装到专用报文传送到A,这相当于B把数据buffer的操作权交给了A。同时B在他的WQ中注册一个WR,用于接收数据传输的A返回的状态。
  • A在收到B发送过来的数据地址VB和R_key之后,RNIC会把它们连同本地存储数据的地址VA封装到Read请求中,将这个请求消息发送到B,这个过程A、B两端不需任何软件参与,就可以将B中的数据存储到A的VA虚拟地址。
  • A在存储完成后,向B返回数据传输的状态信息。

6.2单向通信-写Write

  • 首先A、B建立连接,QP已经创建并初始化。
  • 数据远端的目标存储空间buffer的地址为VB,注意VB是提前注册到B的RNIC,并且它是一个Memory Region,并拿到返回的local key,相当于RDMA操作这块buffer的权限。
  • B把数据地址VB,key封装到专用报文传送到A,这相当于B把数据buffer的操作权交给了A。同时B在他的WQ中注册一个WR,用于接收数据传输的A返回的状态。
  • A在收到B发送过来的数据地址VB和R_key之后,RNIC会把它们连同本地存储数据的地址VA封装到Write请求中,这个过程A、B两端不需任何软件参与,就可以将A中的数据存储到B的VB虚拟地址。
  • A在发送数据完成后,向B返回数据传输的状态信息。

6.3双向通信-Send\Recv

  • 首先,A和B都要创建并初始化好各自的QP、CQ。
  • A、B分别想自己的WQ中注册WQE,对于A来说,WQ=SQ,WQE描述指向一个等待被发送的数据;对于B,WQ=RQ,WQE描述指向一块用于存储数据的Buffer。
  • A的RNIC异步调度轮到A的WQE,解析到这是一个Send消息,从Buffer中直接向B发送数据。数据流到达B的RNIC后,B的WQE被消耗,并把数据直接存储到WQE指向的存储位置。
  • AB通信完成后,A的CQ中会产生一个完成消息CQE表示发送完成。同时,B的CQ中会产生一个完成消息CQE表示接收完成。每个WQ中的WQE的处理完成都会产生一个CQE。

声明致谢:本文所有插图来自Mellanox官方教程文档“RDMA_Basic-16.06.01.pdf”;部分内容参考“RDMA网络编程用户手册-官方材料(中文版)v1.7”

一文带你初识RDMA技术——RDMA概念,特点,协议,通信流程相关推荐

  1. 初识RDMA技术——RDMA概念,特点,协议,通信流程

    1. RDMA概念 在DMA技术中,外部设备(PCIe设备)能够绕过CPU直接访问主机的系统主存: RDMA(Remote Direct Memory Access)在概念上是相对于DMA而言的.指外 ...

  2. 技术VC公司都是干什么的?一文带你读懂技术VC

    技术VC公司是干什么的?相信许多不熟悉这个行业的人对技术VC都不太清楚.技术VC是近年来发展起来的一种新兴创业模式,技术VC公司是通过技术入股项目,和创业者共同发展,在项目成熟之后才可以折现,实现利益 ...

  3. 一文带你初识---虚拟dom

    好久没有来博客了,疫情期间3月中旬从杭州实习公司辞职,在杭州的出租房呆了两个月,准备毕设和毕业相关的材料,顺便找新的工作.最终还是留在了魔都这座城市.现在也算稳定下来了,准备以后好好维护一下博客.第一 ...

  4. python编译原理_编译原理实战课 带你吃透编译技术核心概念与算法

    编译原理实战课,我们到底要学些什么? 在这门课程里,宫老师精选出了Java.Java JIT.Python.JavaScript.Julia.Go.MySQL这7种真实编程语言的编译器,带你阅读它们的 ...

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

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

  6. 产品、技术:如何编写有效的流程文档?

    流程文档是指一系列的.连续的.有规律的活动过程,而这些活动以特定的方式进行,并导致特定结果(创造价值)的产生.流程梳理是指围绕企业的内部要素与外部要素,对整个企业的业务特点和现状进行深入细致的分析.整 ...

  7. 深入浅出,一文带你快速了解RDMA

    RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的.它将数据直接从一台计算机的内存传输到另一台计算机 ...

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

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

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

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

最新文章

  1. ansible自己总结(playbook)
  2. 【生成模型】极大似然估计,你必须掌握的概率模型
  3. mysql实体数据模型闪_visualstudio2017 +EF+Mysql生成实体数据模型闪退
  4. java post流_Java后端HttpClient Post提交文件流 及服务端接收文件流
  5. 【lLinux驱动】linux内核源码目录结构
  6. Windows Server 2016 Hyper-v 嵌套虚拟化技术
  7. html重绘text,使用DrawText重绘C++
  8. android 上传头像工具类,Android开发中如何实现头像的更换与上传
  9. 【工程处理技巧一篇】基于半规则数据的命名实体消歧识别【未完】
  10. R语言——查看内置数据集
  11. linux怎么做冗余备份,linux下使用raid实现冗余备份
  12. 电脑使用变慢七大原因全解析
  13. Civil 3D API二次开发学习指南
  14. 写给零基础小白的网站开发入门
  15. 基于ssh的远程连接服务器
  16. vue-3d-model:一个展示三维模型的 Vue 组件
  17. Elastic:我应该使用 Logstash 或是 Elasticsearch ingest 节点?
  18. 快速将图片背景去掉教程
  19. 费马大定理n=3时的欧拉证明,x^3+y^3=z^3无xyz≠0的整数解
  20. 一个机器人,主要由哪几部分组成?

热门文章

  1. Java—求绝对值(选择结构)
  2. 【罗塞塔石碑】—My Lover(One.iso)
  3. java模仿银行账务业务_Java基础案例 - 模拟银行存取款业务
  4. 微信开发之使用java获取签名signature
  5. POJ_1849 Two
  6. Mac系统随笔 | (1)Mac系统中的PageUp、PageDown、Home和End
  7. 小程序swiper切换闪屏问题
  8. Android 图片压缩之多种压缩方式结合使用,阿里Android开发面试解答
  9. android编译时忽略某些error
  10. ContentProvider理解