什么是RDMA?
来源 https://blog.csdn.net/u011459120/article/details/78469098
1. 概述
RDMA是Remote Direct Memory Access的缩写,通俗的说可以看成是远程的DMA技术,为了解决网络传输中服务器端数据处理的延迟而产生的。RDMA允许用户态的应用程序直接读取或写入远程内存,而无内核干预和内存拷贝发生。起初,只应用在高性能计算领域,最近,由于在大规模分布式系统和数据中心中网络瓶颈越来越突出,逐渐走进越来越多人的视野。
2. 分类
目前,大致有三类RDMA网络,分别是Infiniband、RoCE、iWARP。其中,Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输 , 而RoCE 和 iWARP都是基于以太网的RDMA技术,支持相应的verbs接口,如图1所示。从图中不难发现,RoCE协议存在RoCEv1和RoCEv2两个版本,主要区别RoCEv1是基于以太网链路层实现的RDMA协议(交换机需要支持PFC等流控技术,在物理层保证可靠传输),而RoCEv2是以太网TCP/IP协议中UDP层实现。从性能上,很明显Infiniband网络最好,但网卡和交换机是价格也很高,然而RoCEv2和iWARP仅需使用特殊的网卡就可以了,价格也相对便宜很多。
- Infiniband,支持RDMA的新一代网络协议。 由于这是一种新的网络技术,因此需要支持该技术的NIC和交换机。
- RoCE,一个允许在以太网上执行RDMA的网络协议。 其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是InfiniBand标头。 这支持在标准以太网基础设施(交换机)上使用RDMA。 只有网卡应该是特殊的,支持RoCE。
- iWARP,一个允许在TCP上执行RDMA的网络协议。 IB和RoCE中存在的功能在iWARP中不受支持。 这支持在标准以太网基础设施(交换机)上使用RDMA。 只有网卡应该是特殊的,并且支持iWARP(如果使用CPU卸载),否则所有iWARP堆栈都可以在SW中实现,并且丧失了大部分RDMA性能优势。
图 1 RDMA网络栈
3. APIs
庆幸的是,所有上述RDMA的网络协议都可以使用相同的API(即verbs),使用标准库libverbs。
这里就不展开叙述了,感兴趣的同学可以看参考文献[4][5]。
4. 总结
从上面的叙述,RDMA那么好,但是为什么没有普及呢?个人认为,有两方面原因。首先,是因为价格太贵。其次,是其缺乏像TCP/IP协议的灵活性和更高层的抽象,可进一步参考SOSP’17的论文LITE Kernel RDMA Support for Datacenter Applications。
参考文献
[1] http://www.rdmamojo.com/2014/03/31/remote-direct-memory-access-rdma/.
[2] http://docplayer.net/38877094-How-ethernet-rdma-protocols-iwarp-and-roce-support-nvme-over-fabrics.html.
[3] http://blog.163.com/guaiguai_family/blog/static/20078414520141023103953705/.
[4] https://thegeekinthecorner.wordpress.com/2010/09/28/rdma-read-and-write-with-ib-verbs/.
[5] http://www.cnblogs.com/D-Tec/p/3157582.html.
详解RDMA(远程直接内存访问)架构原理
面对高性能计算、大数据分析和浪涌型IO高并发、低时延应用,现有TCP/IP软硬件架构和应用高CPU消耗的技术特征根本不能满足应用的需求。这要有体现在 处理延时过大,数十微秒;多次内存拷贝、中断处理,上下文切换、复杂的TCP/IP协议处理、网络延时过大、存储转发模式和丢包导致额外延时 。接下来我们继续讨论 RDMA技术、原理和优势 ,看完文章你就会发现为什么RDMA可以更好的解决这一系列问题。
RDMA是一种远端内存直接访问技术,详细介绍请参看 RDMA(远程直接内存访问)技术浅析 文章。 RDMA最早专属于Infiniband架构,随着在网络融合大趋势下出现的RoCE和iWARP ,这使高速、超低延时、极低CPU使用率的RDMA得以部署在目前使用最广泛的以太网上。
RDMAC(RDMA Consortium)和IBTA(InfiniBand Trade Association) 主导了RDMA发展,RDMAC是IETF的一个补充并主要定义的是iWRAP和iSER, IBTA是infiniband的全部标准制定者,并补充了RoCE v1 v2的标准化 。IBTA解释了RDMA传输过程中应具备的特性行为,而传输相关的Verbs接口和数据结构原型是由另一个组织 OFA(Open Fabric Alliance) 来完成。
相比传统DMA的内部总线IO, RDMA通过网络在两个端点的应用软件之间实现Buffer的直接传递;相比比传统的网络传输,RDMA又无需操作系统和协议栈的介入 。RDMA可以轻易实现端点间的超低延时、超高吞吐量传输,而且基本不需要CPU、OS等资源介入,也不必再为网络数据的处理和搬移耗费过多其他资源。
InfiniBand 通过以下技术保证网络转发的低时延( 亚微秒级 ), 采用Cut-Through转发模式,减少转发时延;基于Credit的流控机制,保证无丢包;硬件卸载;Buffer尽可能小,减少报文被缓冲的时延 。
iWARP(RDMA over TCP/IP) 利用成熟的IP网络; 继承RDMA的优点;TCP/IP硬件实现成本高,但如果采用传统IP网络丢包对性能影响大 。
RoCE 性能与IB网络相当; DCB特性保证无丢包;需要以太网支持DCB特性;以太交换机时延比IB交换机时延要稍高一些 。
RoCEv2针对RoCE进行了一些改进,如引入IP解决扩展性问题,可以跨二层组网;引入UDP解决ECMP负载分担等问题。
基于InfiniBand的RDMA是在2000年发布规范,属于原生RDMA;基于TCP/IP的RDMA称作iWARP,在 2007年形成标准,主要包括MPA/ DDP/ RDMAP三层子协议;基于Ethernet的RDMA叫做RoCE,在2010年发布协议,基于增强型以太网并将传输层换成IB传输层实现。
扩展RDMA API接口以兼容现有协议/应用, OFED(Open Fabrics Enterprise Distribution)协议栈由OpenFabric联盟发布,分为Linux和windows版本,可以无缝兼容已有应用 。通过使已有应用与RDMA结合后,性能成倍提升。
应用和RNIC(RDMA-aware Network Interface Controller)之间的传输接口层(Software Transport Interface)被称为Verbs 。OFA(Open Fabric Alliance)提供了RDMA传输的一系列Verbs API,开发了OFED(Open Fabric Enterprise Distribution)协议栈,支持多种RDMA传输层协议。
OFED向下 除了提供RNIC(实现 RDMA 和LLP( Lower Layer Protocol))基本的队列消息服务外,向上还提供了ULP(Upper Layer Protocols) ,通过ULP上层应用不需直接和Verbs API对接,而是借助于ULP与应用对接,这样使得常见的应用不需要做修改就可以跑在RDMA传输层上。
在Infiniband/RDMA的模型中,核心是如何实现应用之间最简单、高效和直接的通信。RDMA提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需操作系统和协议栈的介入。
消息服务建立在通信双方 本端和远端应用之间创建的Channel-IO连接之上 。当应用需要通信时,就会创建一条 Channe l连接,每条Channel的首尾端点是两对 Queue Pairs(QP),每对QP由Send Queue(SQ)和Receive Queue(RQ)构成 ,这些队列中管理着各种类型的消息。QP会被映射到应用的虚拟地址空间,使得应用直接通过它访问RNIC网卡。除了QP描述的两种基本队列之外,RDMA还提供一种队列 Complete Queue(CQ) ,CQ用来知会用户WQ上的消息已经被处理完。
RDMA提供了一套软件传输接口,方便用户创建传输请求 Work Request(WR) ,WR中描述了应用希望传输到Channel对端的消息内容,WR通知QP中的某个队列Work Queue(WQ)。在WQ中,用户的WR被转化为Work Queue Ellement(WQE)的格式,等待RNIC的异步调度解析,并从WQE指向的Buffer中拿到真正的消息发送到Channel对端。
RDMA中SEND/RECEIVE是双边操作,即必须要远端的应用感知参与才能完成收发。 READ和WRITE是单边操作 ,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信,数据的读或写都通过RDMA在RNIC与应用Buffer之间完成,再由远端RNIC封装成消息返回到本端。在实际中, SEND /RECEIVE多用于连接控制类报文,而数据报文多是通过READ/WRITE来完成的 。
对于双边操作为例,主机A向主机B(下面简称A、B)发送数据的流程如下
1. 首先,A和B都要创建并初始化好各自的QP,CQ
2. A和B分别向自己的WQ中注册WQE,对于A,WQ=SQ,WQE描述指向一个等到被发送的数据;对于B,WQ=RQ,WQE描述指向一块用于存储数据的Buffer。
3. A的RNIC异步调度轮到A的WQE,解析到这是一个SEND消息,从Buffer中直接向B发出数据。数据流到达B的RNIC后,B的WQE被消耗,并把数据直接存储到WQE指向的存储位置。
4. AB通信完成后,A的CQ中会产生一个完成消息CQE表示发送完成。与此同时,B的CQ中也会产生一个完成消息表示接收完成。每个WQ中WQE的处理完成都会产生一个CQE。
双边操作与传统网络的底层Buffer Pool类似,收发双方的参与过程并无差别,区别在零拷贝、Kernel Bypass,实际上对于RDMA,这是一种复杂的消息传输模式,多用于传输短的控制消息 。
对于单边操作,以存储网络环境下的存储为例(A作为文件系统,B作为存储介质),数据的流程如下
1. 首先A、B建立连接,QP已经创建并且初始化。
2. 数据被存档在A的buffer地址VA,注意VA应该提前注册到A的RNIC,并拿到返回的local key,相当于RDMA操作这块buffer的权限。
3. A把数据地址VA,key封装到专用的报文传送到B,这相当于A把数据buffer的操作权交给了B。同时A在它的WQ中注册进一个WR,以用于接收数据传输的B返回的状态。
4. B在收到A的送过来的数据VA和R_key后,RNIC会把它们连同存储地址VB到封装RDMA READ,这个过程A、B两端不需要任何软件参与,就可以将A的数据存储到B的VB虚拟地址。
5. B在存储完成后,会向A返回整个数据传输的状态信息。
单边操作传输方式是RDMA与传统网络传输的最大不同,只需提供直接访问远程的虚拟地址,无须远程应用的参与其中,这种方式适用于批量数据传输。
简单总结
Infiniband的成功取决于两个因素,一是主机侧采用RDMA技术,可以把主机内数据处理的时延从几十微秒降低到几微秒,同时不占用CPU;二是InfiniBand网络的采用高带宽(40G/56G)、低时延(几百纳秒)和无丢包特性
随着以太网的发展,也具备高带宽和无丢包能力,在时延方面也能接近InfiniBand交换机的性能,所以RDMA over Ethernet(RoCE)成为必然,且RoCE组网成本更低。未来RoCE、iWARP和Infiniband等基于RDMA技术产品都会得到长足的发展。
链接:https://www.zhihu.com/question/59122163/answer/208899370
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
InfiniBand (以下简称IB)只是RDMA实现方式的一种!RDMA本身只是一种概念,具体实现不同厂商都有自己的实现方式,目前市场上能见到的RDMA产品可以分为三类:
1. InfiniBand --- 这个最早是IBM和HP等一群大佬在做,现在主要交给以色列的Mellanox (IBM 控股),但是InfiniBand从L2到L4都需要自己的专有硬件,所以成本非常高!
2. RoCE --- RDMA over Converged Ethernet,RoCE这个东西实际上是Mellanox鉴于IB过于昂贵这个事实推出的一种低成本的产品,实际上的核心就是把IB的包架在通用Ethernet上发出去,因此对于RoCE,实际上它的二层包头已经是普通以太网的包头。
3. iWARP --- iWARP直接将RDMA实现在了TCP上,优点是成本最低,只需要采购支持iWARP的NIC即可使用RDMA,缺点是性能不好,因为TCP本身协议栈过于重量级,即便是按照一般iWARP厂商的做法将TCP offload到硬件上实现,也很难追上IB和RoCE的性能。目前在做iWARP的主要是Intel和Chelsio两家,从现在的观察Chelsio略胜一筹,而Intel则有点想放弃iWARP转投RoCE之势。
需要说明的一点,其实不管是iWARP还是RoCE,实际上并不是自己重新发明了RDMA,而是利用了IB的上层接口修改了下层的实现,所以RoCE这个名字并不是很准确,比较准确的说法应该是IB over Converged Ethernet。此外,三种实现方式使用的user space api是一样的,都是libibverbs,这个东西原本也就是给IB用的,相当于IB的socket。
关于市场,实际上RDMA的市场一直都不算太小,传统的IB主要面向的是HPC,HP和IBM一直在使用,但是毕竟HPC只是企业级里面一块很小的业务,也不是什么企业都需要或者用得起HPC的。现在比较值得注意的一点是Intel实际上提出来了一种概念叫做“新型RDMA应用”,即传统的RDMA应用对lat和bw都非常敏感,而新型RDMA应用则在lat上可以相对宽松,但是却要求在短时间内爆发式的单播或者广播(因为RDMA在协议栈层就支持可靠广播)大量的数据包。比较典型的一个应用是现在很火的大数据,IBM做了一个东西叫做Spark over RDMA,视频链接如下 (需翻墙):
https://www.youtube.com/watch?v=t_4Ao2fNAfU
该方案修改了Spark的底层网络框架,充分利用了Mellanox 100G RoCE的可靠广播功能,差不多比100G TCP性能提高了6~7倍。除了大数据之外,存储市场是将来RDMA发展的一个主要方向,事实上RDMA已经成为了下一代存储网络的事实标准。国内有一家公司叫XSky给Ceph贡献了5%的代码,Ceph over RDMA就是他们实现的印象中EMC还给过他们一大笔投资。存储网络中对RDMA的使用实际上很大一部分原因是现在SSD和NVMe SSD在企业级存储中的应用。举个简单栗子:
在10G网络上,如果用iscsi架构,iodepth=32,block-size=4k, random-read-write,TCP能实现的iops约为160~170k,这个数字对于一般的HDD阵列来讲已经足够,因为HDD阵列本身速度较慢。但是对于SSD单盘180k以上的iops,显然TCP性能是不足的,更遑论NVMe SSD单盘550k的ipos。因此,在SSD时代的存储网络中,RDMA几乎是一个必选项。