Chinaunix首页 | 论坛 | 博客
  • 博客访问: 623761
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-25 16:47
个人简介

嵌入式linux爱好者

文章分类
文章存档

2020年(1)

2019年(39)

2018年(3)

2017年(20)

2016年(7)

2015年(1)

2014年(4)

我的朋友

分类: 大数据

2019-09-13 15:37:04

原文地址:RDMA的原理、传输与Verbs 作者:polejo

RDMA最早专属于infiniband架构。在网络融合的大趋势下出现的RoCE,使高速、超低延时、极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上。
    对比传统DMA的内部总线IORDMA通过网络在两个端点的应用软件之间实现buffer的直接传递;而对比传统的网络传输,RDMA又无需操作系统和协议栈的介入。RDMA可以轻易实现端点间的超低延时、超高吞吐量传输,而且基本不需要CPUOS的资源参与,在高速网络环境下,不必再为网络数据的处理和搬移耗费过多资源。一言概之,RDMA三大特性:CPU offload kernel bypasszero-copy   
 

  RDMA VS Traditional network

原理

传统的网络架构以“网络为中心”,网络公用的软件部分被实现到OS的协议栈,所以OS在所有应用的网络请求时都必须参与其中,并且socketskbuffring buffer的转换都伴随着数据报文的拷贝,容易产生性能瓶颈。


  网络环境下的CPU负载消耗


Infiniband/RDMA的模型中,核心“以服务为中心”,围绕一个基本问题:如何实现应用之间最简单、高效和直接的通信RDMA提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需OS和协议栈的介入。

消息服务建立在通信双方本端和远端应用之间创建的channel-IO连接之上。当应用需要通信时,就会创建一条Channel连接,每条Channel的首尾端点是两对Queue PairsQP),每对QPSend QueueSQ)和Receive QueueRQ)构成,这些队列中管理着各种类型的消息。QP会被映射到应用的虚拟地址空间,使得应用直接通过它访问RNIC。除了QP描述的两种基本队列之外,RDMA还提供一种队列-Complete QueueCQ),CQ用来知会用户WQ上的消息已经被处理完。

RDMA提供了一套software transport interface,方便用户创建传输请求-Work RequestWR),WR中描述了应用希望传输到Channel对端的消息内容。WR通知给QP中的某个队列-Work QueueWQ)。在WQ中,用户的WR被转化为Work Queue EllementWQE)的格式,等待RNIC的异步调度解析,并从WQE指向的buffer中拿到真正的消息发送到Channel对端。

传输


  RDMA send/receiveread/write传输

    RDMA共有三种底层数据传输模式。SEND/RECEIVE是双边操作,即必须要远端的应用感知参与才能完成收发。READWRITE是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或存都通过远端的DMARNIC与应用buffer之间完成,再由远端RNIC封装成消息返回到本端。在实际中,SEND/RECEIVE多用于连接控制类报文,而数据报文多是通过READ/WRITE来完成的。

对于双边操作为例,AB发送数据的流程如下:

1.       首先,AB都要创建并初始化好各自的QPCQ

2.       AB分别向自己的WQ中注册WQE,对于AWQ=SQWQE描述指向一个等到被发送的数据;对于BWQ=RQWQE描述指向一块用于存储数据的buffer

3.       ARNIC异步调度轮到AWQE,解析到这是一个SEND消息,从buffer中直接向B发出数据。数据流到达BRNIC后,BWQE被消耗,并把数据直接存储到WQE指向的存储位置。

4.       AB通信完成后,ACQ中会产生一个完成消息CQE表示发送完成。与此同时,BCQ中也会产生一个完成消息表示接收完成。每个WQWQE的处理完成都会产生一个CQE

双边操作与传统网络的底层buffer pool类似,收发双方的参与过程并无差别,区别在零拷贝、kernel bypass,实际上传统网络中一些高级的网络SOC已经实现类似功能。对于RDMA,这是一种复杂的消息传输模式,多用于传输短的控制消息。

 

         对于单边操作,以存储网络环境下的存储为例(A作为文件系统,B作为存储介质):

1.       首先AB建立连接,QP已经创建并且初始化。

2.       数据被存档在Abuffer地址VA,注意VA应该提前注册到ARNIC,并拿到返回的local key,相当于RDMA操作这块buffer的权限。

3.       A把数据地址VAkey封装到专用的报文传送到B,这相当于A把数据buffer的操作权交给了B。同时A在它的WQ中注册进一个WR,以用于接收数据传输的B返回的状态。

4.       B在收到A的送过来的数据VAR_key后,RNIC会把它们连同存储地址VB到封装RDMA READ,这个过程AB两端不需要任何软件参与,就可以将A的数据存储到BVB虚拟地址。

5.       B在存储完成后,会向A返回整个数据传输的状态信息。

单边操作传输方式是RDMA与传统网络传输的最大不同,提供直接访问远程的虚拟地址,无须远程应用的参与,这种方式适用于批量数据传输。

Verbs

RDMAC)和IBTA)主导了RDMA,RDMACIETF的一个补充,它主要定义的是iWRAPiSER,IBTAinfiniband的全部标准制定者,并补充了RoCE v1 v2的标准化。应用和RNIC之间的传输接口层(software transport interface)被称为VerbsIBTA解释了RDMA传输过程中应具备的特性行为,而并没有规定Verbs的具体接口和数据结构原型。这部分工作由另一个组织OFA)来完成,OFA提供了RDMA传输的一系列Verbs APIOFA开发出了OFEDOpen Fabric Enterprise Distribution)协议栈,支持多种RDMA传输层协议。

 OFED中除了提供向下与RNIC基本的队列消息服务,向上还提供了ULPUpper Layer Protocols),通过ULPs,上层应用不需要直接到Verbs API对接,而是借助于ULP与应用对接,常见的应用不需要做修改,就可以跑在RDMA传输层上。


阅读(11532) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~