初识RDMA技术——RDMA概念,特点,协议,通信流程
作者:互联网
1. RDMA概念
在DMA
技术中,外部设备(PCIe设备)能够绕过CPU
直接访问主机的系统主存;
RDMA
(Remote Direct Memory Access)在概念上是相对于DMA而言的。指外部设备能够绕过CPU
,不仅可以访问本地主机的主存
,它还可以访问另一台远端主机上用户态的系统主存
。
2. RMDA与Socket
- Socket通信示意图:
在传统的Socket套接字
网络中,应用程序向操作系统申请网络资源
时,要通过特定的API
来管理程序的行为。 - RDMA通信示意图:
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.2 TCP/IP存在的问题
传统TCP/IP通信存在的主要问题就是I/O瓶颈
问题。在高速网络环境下与网络I/O相关的主机处理的高开销(数据移动操作和复制操作)限制了机器之间的传输带宽。
具体来说,传统的TCP/IP网络通信是通过内核发送消息
。通过内核来传输消息这种机制会导致性能低
和灵活性差
。
- 性能低的主要原因是:由于网络通信通过
内核传递
,需要在内核中频繁进行协议封装和解封操作,造成很大的数据移动和数据复制开销。 - 灵活性差的原因是:是因为网络通信协议在
内核中进行处理
,这种方式很难支持新的网络协议和新的消息通信协议以及发送和接收接口。
3.RDMA的原理
- 背景:为了
消除传统网络通信带给计算任务的瓶颈
,我们希望更快和更轻量级的网络通信,由此提出了RDMA技术。 - 原理:RDMA利用
栈旁路
和零拷贝
技术提供了低延迟的特性。 - 效果:
减少了CPU占用
,减少了内存带宽
瓶颈,提供了很高的带宽利用率。RDMA提供了给基于IO的通道,这种通道允许一个应用程序通过RDMA设备对远程的虚拟内存进行直接的读写。
RDMA技术的设计主要有以下几个原理/特点:
3.1 CPU Offload(CPU Bypass)
无需CPU干预,应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU(这里面可能有歧义,应该还会通知CPU的)。远程主机内存能够被读取而不需要远程主机上的进程(或CPU)参与。远程主机的CPU的缓存(cache)不会被访问的内存内容所填充。
3.2 Kernel Bypass
内核旁路指的是,应用程序可以直接在用户态
执行数据传输,不需要在内核态与用户态之间做上下文切换。
3.3 Zero 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
来使用,但它们有着不同的物理层和链路层。
4.1 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使用同轴电缆和光纤进行连接。
4.2 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协议也可以使用在传统以太网网络或者非融合以太网络中。
4.3 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连接。
每种模式中可用的操作如下表所示:
- 一个 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典型实例
一个典型的应用程序结构如下:
- 获取设备列表:首先必须检查得到本机可用的IB设备列表。列表中的每个设备都包含一个名字和GUID。
- 打开要请求的设备:遍历设备列表,通过设备的GUID或者名字选择并打开它。
- 查询设备的工作能力:设备的工作能力能使用户了解已打开设备支持的特性和能力。
- 分配保护域以及您的资源:保护域(PD)允许用户限制哪些组件只能相互交互。这个组件可以是AH、QP、MR、MW、和SRQ。
- 注册一个内存区域:VPI仅适用于已注册的内存。进程的虚拟空间中任何有效的内存缓冲区都可以进行注册。在注册过程中,用户设置内存权限并接收本地和远程秘钥(lkey,rkey),稍后将使用这些秘钥来引用此内存缓冲区。
- 创建完成队列:一个CQ包含完成的工作请求(WR)。每个WR将生成放置在CQ中的完成队列实体CQE。CQE将制定WR是否成功完成。
- 创建队列对(QP):创建QP还将创建关联的发送队列和接收队列 。
- 提出QP:创建的QP仍无法使用,直到它转换为几个状态,最终进入Ready To Send(RTS)。者提供了QP用于 发送/接收数据所需的信息。
- 发布工作请求并poll完成:使用创建的QP进行通信。
- 清理:按照创建前述对象的相反顺序销毁对象:删除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”
标签:QP,流程,初识,RDMA,内存,注册,操作,远程 来源: https://blog.csdn.net/u011458874/article/details/121602188