本想完全靠自己的语言完成这篇概述,但是开篇并没有想像当中的好写,看样子从宏观上概括一个技术比从微观上探究细枝末节要困难不少。本文是先前人们对RDMA技术的介绍为主,加入了一些自己的理解。随着本专栏内容的降低,本篇概述也会更新和逐步建立。
哪些是DMA
DMA全称为DirectMemoryAccess,即直接显存访问。意思是外设对显存的读写过程可以不用CPU参与而直接进行。我们先来看一下没有DMA的时侯:
无DMA控制器时I/O设备和显存间的数据路径
假定I/O设备为一个普通网卡,为了从显存领到须要发送的数据,之后组装数据包发送到化学链路上,网卡须要通过总线告知CPU自己的数据恳求。之后CPU将会把显存缓冲区中的数据复制到自己内部的寄存器中,再复制到I/O设备的储存空间中。假如数据量比较大,这么很长一段时间内CPU就会疏于搬动数据,而未能投入到其他工作中去。
CPU的最主要工作是估算,而不是进行数据复制,这些工作属于白白浪费了它的估算能力。为了给CPU“减负”,让它投入到更有意义的工作中去,后来人们设计了DMA机制:
有DMA控制器时I/O设备和显存间的数据路径
可以看见总线上又挂了一个DMA控制器,它是专门拿来读写显存的设备。有了它之后,当我们的网卡想要从显存中拷贝数据时,不仅一些必要的控制命令外,整个数据复制过程都是由DMA控制器完成的。过程跟CPU复制是一样的,只不过此次是把显存中的数据通过总线复制到DMA控制器内部的寄存器中,再复制到I/O设备的储存空间中。CPU不仅关注一下这个过程的开始和结束以外,其他时间可以去做其他事情。
DMA控制器通常是和I/O设备在一起的,也就是说一块网卡中既有负责数据收发的模块,也有DMA模块。
哪些是RDMA
RDMA(RemoteDirectMemoryAccess)意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的显存。所谓直接,指的是可以像访问本地显存一样,绕开传统以太网复杂的TCP/IP网路合同栈读写远端显存,而这个过程对端是不感知的,并且这个读写过程的大部份工作是由硬件而不是软件完成的。
为了才能直观的理解这一过程,请看下边两个图(图中箭头仅做示意,不表示实际逻辑或数学关系):
传统网路中,“节点A给节点B发消息”实际上做的是“把节点A显存中的一段数据,通过网路链路搬动到节点B的显存中”,而这一过程无论是发端还是收段,都须要CPU的指挥和控制,包括网卡的控制,中断的处理,报文的封装和解析等等。
上图中右侧的节点在显存用户空间中的数据,须要经过CPU拷贝到内核空间的缓冲区中,之后才可以被网卡访问,这期间数据会经过软件实现的TCP/IP合同栈,加上各层脸部和校准码,例如TCP头,IP头等。网卡通过DMA拷贝内核中的数据到网卡内部的缓冲区中,进行处理后通过化学链路发送给对端。
对端收到数据后,会进行相反的过程:从网卡内部储存空间,将数据通过DMA拷贝到显存内核空间的缓冲区中,之后CPU会通过TCP/IP合同栈对其进行解析,将数据取下来拷贝到用户空间中。
可以看见,虽然有了DMA技术,上述过程还是对CPU有较强的依赖。
而使用了RDMA技术以后,这一过程可以简单的表示成下边的示意图:
同样是把本端显存中的一段数据,复制到对端显存中,在使用了RDMA技术时,两端的CPU几乎不用参与数据传输过程(只参与控制面)。本端的网卡直接从显存的用户空间DMA拷贝数据到内部储存空间,之后硬件进行各层报文的组装后,通过化学链路发送到对端网卡。对端的RDMA网卡收到数据后,剥离各层报文头和校准码,通过DMA将数据直接拷贝到用户空间显存中。
RDMA的优势
RDMA主要应用在高性能估算(HPC)领域和小型数据中心当中,而且设备相对普通以太网卡要高昂不少(例如Mellanox公司的Connext-X5100GbPCIe网卡市价在4000元以上)。因为使用场景和价位的缘由,RDMA与普通开发者和消费者的距离较远,目前主要是一些小型互联网企业在布署和使用。
RDMA技术为何可以应用在上述场景中呢?这就涉及到它的以下几个特征:
因为Linux等操作系统将显存界定为用户空间和内核空间,在传统的Socket通讯流程中CPU须要多次把数据在显存中来回拷贝。而通过RDMA技术,我们可以直接访问远端早已注册的显存区域。
关于0拷贝可以参考这篇文章:/p/e76e3580e356
上图(原图[1])可以挺好的解释“0拷贝”和“内核Bypass”的涵义。上下两部份分别是基于Socket的和基于RDMA的一次收-发流程linux软件工程师培训,左右分别为两个节点。可以显著的看见Socket流程中在软件中多了一次拷贝动作。而RDMA绕开了内核同时也降低了显存拷贝,数据可以直接在用户层和硬件间传递。
通讯领域两大上场率最高的性能指标就是“带宽”和“时延”。简单的说,所谓带宽指的是指单位时间内就能传输的数据量,而码流指的是数据从本端发出到被对端接收所花费的时间。由于上述几个特征,相比于传统以太网,RDMA技术同时做到了更高带宽和更低信噪比,所以其在带宽敏感的场景——比如海量数据的交互,信噪比敏感——比如多个估算节点间的数据同步的场景下得以发挥其作用。
合同
RDMA本身指的是一种技术,具体合同层面,包含Infiniband(IB),RDMAoverConvergedEthernet(RoCE)和internetWideAreaRDMAProtocol(iWARP)。三种合同都符合RDMA标准,使用相同的下层插口,在不同层次上有一些差异。
上图[2]对于几种常见的RDMA技术的合同层次做了特别清晰的对比,
Infiniband
2000年由IBTA(InfiniBandTradeAssociation)提出的IB合同是当之无愧的核心,其规定了一整套完整的链路层到传输层(非传统OSI七层模型的传输层社区linux,而是坐落其之上)规范,而且其难以兼容现有以太网,不仅须要支持IB的网卡之外,企业假如想布署的话还要重新订购配套的交换设备。
RoCE
RoCE从中文全称就可以看出它是基于以太网链路层的合同,v1版本网路层一直使用了IB规范,而v2使用了UDP+IP作为网路层,致使数据包也可以被路由。RoCE可以被觉得是IB的“低成本解决方案”,将IB的报文封装成以太网包进行收发。因为RoCEv2可以使用以太网的交换设备,所以如今在企业中应用也比较多,然而相同场景下相比IB性能要有一些损失。
iWARP
iWARP合同是IETF基于TCP提出的,由于TCP是面向联接的可靠合同,这促使iWARP在面对有损网路场景(可以理解为网路环境中可能常常出现丢包)时相比于RoCEv2和IB具有更好的可靠性,在大规模组网时也有显著的优势。并且大量的TCP联接会花费好多的显存资源,另外TCP复杂的流控等机制会造成性能问题,所以从性能上看iWARP要比UDP的RoCEv2和IB差。
须要注意的是,尽管有软件实现的RoCE和iWARP合同,并且真正商用时上述几种合同都须要专门的硬件(网卡)支持。
iWARP本身不是由Infiniband直接发展而至的,并且它承继了一些Infiniband技术的设计思想。这三种合同的关系如右图所示:
玩家标准/生态组织
提及IB合同,就不得不提及两大组织——IBTA和OFA。
IBTA[3]
创立于1999年,负责制订和维护Infiniband合同标准。IBTA独立于各个厂商,通过赞助技术活动和促进资源共享来将整个行业整合在一起,但是通过线上交流、营销和线下活动等形式积极推广IB和RoCE。
IBTA会对商用的IB和RoCE设备进行合同标准符合性和互操作性测试及认证,由好多小型的IT厂商组成的委员会领导,其主要成员包括博通,HPE,IBM,英特尔,Mellanox和谷歌等linux c,华为也是IBTA的会员。
OFA[4]
创立于2004年的非赢利组织,负责开发、测试、认证、支持和分发独立于厂商的开源跨平台infiniband合同栈,2010年开始支持RoCE。其对用于支撑RDMA/Kernelbypass应用的OFED(OpenFabricsEnterpriseDistribution)软件栈负责,保证其与主流软硬件的兼容性和易用性。OFED软件栈包括驱动、内核、中间件和API。
上述两个组织是配合关系,IBTA主要负责开发、维护和提高Infiniband合同标准;OFA负责开发和维护Infiniband合同和下层应用API。
开发社区Linux社区
Linux内核的RDMA子系统还算比较活跃,时常会讨论一些合同细节,对框架的更改比较频繁,另外包括华为和Mellanox在内的一些厂商也会常常对驱动代码进行更改。
电邮订阅:/vger-lists.html#linux-rdma
代码坐落内核drivers/infiniband/目录下,包括框架核心代码和各厂商的驱动代码。
代码仓:/pub/scm/linux/kernel/git/rdma/rdma.git/
RDMA社区
对于下层用户,IB提供了一套与Socket套接字类似的插口——libibverbs,前文所述三种合同都可以使用。参考着合同、API文档和示例程序很容易就可以写一个Demo下来。本专栏中的RDMA社区专指其用户态社区,在github上其库房的名子为linux-rdma。
主要包含两个子库房:
用户态核心代码,API,文档以及各个厂商的用户态驱动。
一个功能强悍的用于测试RDMA性能的工具。
代码仓:/linux-rdma/
UCX[5]
UCX是一个构建在RDMA等技术之上的用于数据处理和高性能估算的通讯框架,RDMA是其底层核心之一。我们可以将其理解为是坐落应用和RDMAAPI之间的中间件,向下层用户又封装了一层更易开发的插口。
笔者对其并不了解太多,只晓得业界有一些企业在基于UCX开发应用。
代码仓:/openucx/ucx
硬件厂商
设计和生产IB相关硬件的厂商有不少,包括Mellanox、华为、收购了Qlogic的IB技术的Intel,博通、Marvell,东芝等等,这儿就不挨个展开了,仅简单提一下Mellanox和华为。
IB领域的领头羊,合同标准制订、软硬件开发和生态建设都能见到Mellanox的身影,其在社区和标准制订上上拥有最大的话语权。目前最新一代的网卡是支持200Gb/s的ConnextX-6系列。
今年初推出的鲲鹏920芯片早已支持100Gb/s的RoCE合同,技术上在国外处于领先地位。并且软硬件和影响力方面距离Mellanox还有比较长的路要走,相信华为才能尽快赶上老大哥的脚步。
用户
谷歌、IBM和国外的阿里、京东都正在使用RDMA,另外还有好多小型IT公司在做初步的开发和测试。在数据中心和高性能估算场景下社区linux,RDMA取代传统网路是大势所趋。笔者对于市场接触不多,所以并不能提供更详尽的应用情况。
下一篇将用比较直观的方法比较一次典型的基于Socket的传统以太网和RDMA通讯过程。