醋醋百科网

Good Luck To You!

网络大提速,RDMA,IB,iWrap_网络提升器下载

本章第一节介绍的存储设备方面的创新解决了CPU访问存储设备的性能问题。但在实际的业务当中,数据的传输除了在节点内部的CPU与存储设备间外,节点之间也存在数据传输的需求。本节我们就介绍在网络传输方面是如何提速的。

在介绍新的网络技术之前,我们看看传统网络是如何传输数据的,比如我们常见的以太网。当节点0向节点1发送数据时,其整个数据处理的流程如下图所示,可以看到其过程还是比较复杂的。

在节点0,应用程序首先需要将其缓冲区中的数据通过系统调用的方式拷贝到操作系统内核TCP/IP协议栈当中,内核进一步将数据拷贝到网卡中。节点0的网卡将数据发出后,节点1的网卡会收到数据,然后数据首先从网卡拷贝到内核的TCP/IP协议栈,然后再从内核拷贝到应用程序缓冲区。可以看到,在整个数据的传输过程中存在多次数据拷贝的过程,这将极大的增加数据传输的延时。

为了减少数据传输过程中的数据拷贝,有一种称为RDMA的技术被提出。RDMA可以使节点0通过网络直接访问节点1的内存,并且跳过内核与用户态应用程序的内存拷贝,这样极大的降低了数据传输延时。我们可以用下图示意RDMA数据传输的过程。


基于RDMA传输数据可以直接旁路内核协议栈和内核设备驱动,实现应用程序虚拟内存间的内存访问。显然,这种技术可以显著的提升数据传输带宽,并降低数据传输延时。那么这种技术是如何实现的呢?

等等!RDMA这个缩写好像有点眼熟,记得上学的时候学过一种称为DMA的技术。我们先回忆一下DMA技术吧,DMA的全称是Direct Memory Access,也就是直接内存访问。如何理解直接内存访问这个概念?难道还有间接内存访问?

我们在第一章介绍计算机体系结构相关内容的时候知道CPU、内存和外围设备通过总线相连。其中CPU是中枢,当外围设备有数据输入时会对CPU产生中断,此时CPU首先将数据从外围设备的控制器读到其寄存器中(如下图步骤1所示),然后再由寄存器搬运到内存当中(如下图步骤2所示)。向外围设备输出数据与此类似,需要CPU将内存的数据搬运到外围设备的控制器。简而言之,计算机的外围设备(例如网卡和硬盘)与内存交互数据都需要CPU的参与。

CPU参与这些任务有什么问题吗?其实倒没什么问题,但是由于搬运数据会占用CPU指令周期,这就会消耗计算资源。特别是涉及海量数据传输时,传统方式会大量的消耗CPU资源。另外,不仅仅会消耗CPU资源,还会导致数据处理延时的增加。那么有没有一种方式可以不经过CPU,直接将外围设备控制器中的数据传输到系统内存当中呢?这就是DMA技术。

从名称也可以看出,DMA是一种让外围设备直接访问系统内存的技术,从而将CPU从数据传输过程中释放出来。整个过程是通过一个称为DMA控制器(DMA Controller,简称DMAC)的芯片协调完成了。如下图是CPU、DMAC、网卡和内存的拓扑结构图,接下来我们简要介绍一下处理流程。

当网卡想与内存交互数据时,他会通过DRQ向DMA控制器发送一个请求。当DMA控制器收到DRQ请求时,他会通过HLD请求CPU保持几个时钟周期。

当CPU收到DMA控制器的保持请求(HLD)时,CPU将释放系统总线,并通过HLDA通知DMA控制器。

DMA控制器收到保持应答(HLDA)后,他会通过DACK通知网卡可以开始数据传输了,此时DMA控制器接管系统总线,并进行数据传输。

数据传输完成后,DMA控制器会向CPU发送一个中断通知CPU数据传输已经完成。此时,CPU可以接管总线并进行其他处理。

回忆完DMA技术之后,我们接下来介绍一下RDMA。RDMA是Remote DMA的简称,也就是远程直接内存访问技术。RDMA能够是计算机0直接访问计算机1的内存,而无需依赖任一计算机的处理器、缓存或操作系统。换而言之,计算机0的应用程序可以直接将计算机1中内存中的数据读到自己的进程空间虚拟内存当中。而这个过程不需要操作系统内核、页缓存甚至处理器来参与。综合而言,RMDA有如下特点,所以整个数据的传输延时得到大幅的优化。

零拷贝: 数据不再需要从应用程序的虚拟内存拷贝到操作系统的内核协议栈,而是直接拷贝到适配卡的缓存当中。

内核旁路和协议卸载: 数据传输不在需要经过内核协议栈,数据的处理逻辑变得非常简单。

卸载CPU:由于可以实现适配器缓冲区与内存的直接数据交互,而不需要CPU的参与,因此可以极大的释放CPU资源。

目前有3种支持RDMA的网络技术,分别是IB(InfiniBand,也就是无线带宽)、RoCE(RDMA over Converged Ethernet)和iWARP(RDMA over TCP)。IB是设计之初就支持RDMA技术的通信网络,最早应用在高性能计算领域。RoCE和iWARP则是基于以太网实现的RDMA。需要注意的是,IB是一套完整的网络协议栈,可以类比常见TCP/IP协议。而RoCE和iWARP则是基于现有的以太网实现,并非全新的网络协议栈。

我们可以通过下面这张图来展示一下上述3中网络通信技术的差异。在该图中,我们可以看出IB的整个协议栈是全新设计的,从物理层到链路层,再到传输层。另外两个协议在基于现有的以太网协议构建,并非从零设计。虽然上述3者的协议栈不同,但是他们共享相同的软件栈,并为应用层提供相同的API。

有人可能会问,既然已经有了IB协议支持RDMA,而且应用还挺广泛,为什么要再搞一套RoCE和iWARP。主要原因在与IB是一套独立的协议,如果想使用IB,不仅仅在主机端要有相应的适配卡,交换机和路由器也必须是支持IB的专用设备,关键是这些设备还非常贵。所以,RoCE和iWARP就应运而生。接下来我们简要介绍一下IB、RoCE和iWARP的更多细节。

IB协议

如前文所述,IB是一个独立的协议,就像TCP/IP协议和FC协议一样,它从硬到软定义了一个完整的协议栈。如下图是IB的整个协议栈示意图,在示意图中既包含对协议分层的描述,也有对IB协议所涉及不同类型设备的描述。

对于协议分层,从下往上分别是物理层(Physical Layer)、链路层(Link Layer)、网络层(Network Layer)、传输层(Transport Layer)和上层(Upper Layers)。总体而言,可以看出IB协议栈与TCP/IP协议栈非常类似。关于协议栈的更详细的介绍我们在后续章节会专门介绍,本节不在赘述。

对于IB设备,在该示意图中包含3中类型的设备,分别是终端节点(End Node)、交换机(Switch)和路由器(Router)。其中终端节点通常而言是用于计算的服务器或者存储数据的存储设备。终端节点如果想接入IB网络需要一个主机适配卡,计算节点的适配卡称为主机通道适配器(Host Channel Adapter, 简称HCA),存储节点的适配卡称为目标器通道适配卡(Target Channel Adapter, 简称TCA)。

通过上图我们知道,IB协议即定义了交换设备,又定义了路由设备,所以IB协议是可以实现多个网络互联访问的。上面的协议分层图可能不够只管,我们通过下面的网络拓扑图来展示一下IB的网络结构。

在该图中,我们可以看到终端设备可以通过一个或者多个交换机连成一个子网,多个子网可以通过路由器连接称为一个更大的网络。IB这种连接方式与以太网的连接方式大体上也是一致的。

接下来我们看看IB协议的数据包格式,理解数据包格式将有助于我们理解数据是如何在子网内和跨子网传播的。如下图所示,IB数据包包含链路层包头、网络层包头和传输层包头。

链路层的包头如上图绿色方框所示,其中LRH是Local Routing Header的缩写,IB交换机通过LRH将数据包发送到目的终端节点的端口。LRH的大小是8个字节,其中包含源和目的本地识别符(Local IDentifiers,简称LID)、链接协议版本ID、服务水平、虚拟Lane和包长度等信息。其中路由相关的就是LID了,交换机通过LID可以将数据包转发到目的终端节点。

网络层的包头如上图蓝色方框所示,其中GRH是Global Routing Header的缩写,GRH用于子网之间的数据传输控制。当一个数据包被交换机转发到路由器时,路由器通过GRH决定数据包应该转发到什么位置。在GRH中包含源和目的的全局识别符(Global Unique IDs,简称GUIDs)、全局路由版本ID、负载数据长度和IP版本等信息。

传输层有两个不同的包头,分别是BTH和ETH,其中BTH是Base Transport Header的缩写,也就是基础传输头;ETH是Extended Transport Header的缩写,也就是扩展传输头。在BTH中包含IB的操作符、队列对和可靠传输相关的内容。ETH则包含更一些附加信息,比如虚拟地址和长度等。再往后则是用户真正要传输的数据和校验数据了,这部分内容基本没有太多需要介绍的了。

RoCE协议

RoCE于2009年由IBTA(InifiBand Trade Association)开发。没错!这个组织就是设计IB协议的那个组织。RoCE的全称是RDMA over Converged Ethernet,翻译成中文就是“基于融合以太网的RDMA”技术。对比IB,RoCE并非实现了一个全新的协议栈,而是基于现有的以太网。这么做的一个好处,那就是用户现有的交换设备不需要替换,只需要购买支持RDMA的网卡就行,这无疑增加了客户升级的动力。

目前RoCE有两个版本,其中RoCEv1是基于以太网链路层实现的,只能部署在2层网络;RoCEv2则是UDP实现,因此可以部署在3层网络上。对于RoCEv1,他在以太网链路层上构建了IB网络层,说的直白点就是借助以太网的链路层实现IB数据包的转发,也就是通过以太网交换机转发IB数据包,而不用买IB交换机了。

在数据包层面,IB数据包的LRH被以太网包头替换,具体如下图所示。这样在一个子网内部,通过RoCEv1协议就可以通过已有的以太网交换机来传输数据了。如果我们自己观察就会发现,网络层包头还是GRH,所以如果想跨子网传输,还得需要IB路由器。

图 10-15 SATA与NVMe性能调用栈

于是,RoCEv2诞生了!RoCEv2不仅替换了LRH还改造了GRH。如下图所示,IB协议的GRH被改造成了IP头和UDP头,这下数据包就可以通过以太网路由器实现跨子网的数据传输了,又帮客户省了一笔钱!

iWARP协议

最后我们介绍一下iWARP协议。不同于前两者,iWARP于2007年由IETF(Internet Engineering Task Force)制定,这个组织很厉害,大家应该都知道吧。iWARP的全称是Internet Wide Area Research Protocol,也就是Internet广域网研究协议。iWARP是在TCP/IP协议栈的TCP层实现的RDMA协议。相较而言,RoCE则是在TCP/IP的UDP层实现的RDMA协议。我们可以通过下图对比一下两者的区别。

可以看出,iWARP不是一个单独的协议,而是包含MPA、DDP和RDMAP 3个子协议的。乍一看,iWARP是基于TCP/IP的协议,那他是如何降低延时,提升性能的呢?主要原因在于iWARP将TCP/IP协议从内核卸载到了支持RDMA的网卡当中。同时,iWARP同样可以旁路内核,并运行节点0的应用程序直接将其数据拷贝到节点1的应用程序内存中。由上图可以看出,iWARP位于TCP协议之上,因此客户可以借助现有的以太网交换设备(包含交换机和路由器),只需要其主机中的网卡支持RDMA即可。

上文DDP协议的全称是Direct Data Placement Protocol,翻译成中文就是直接数据放置协议,RFC5041定义了该协议。通过该协议定义了如何在不拷贝数据(零拷贝)的情况进行数据的传输,是iWARP的核心协议。当然,本协议自身并没有实现节点间数据传输的功能,而是由底层的TCP协议完成数据传输的工作。

既然DDP已经具备了零拷贝的功能,为什么还要有一个MPA协议呢?MPA协议的全称是Marker PDU Aligned Framing for TCP,他是DDP协议与TCP协议的适配层协议,RFC5044定义了该协议。英文名称可以看出来,他的主要作用是在TCP协议下为上层PDU分段的。至于为什么要分段和怎么分段等更多的细节内容,我们在第七章会详细介绍。

最后,我们介绍一下RDMAP协议。RDMAP协议的全称是Remote DMA Protocol,这层协议定义了RDMA语义。前文我们知道DDP协议实现了零拷贝等基本功能,但是并没有定义RDMA中的读写数据等语义,而RDMAP则定义了这些语义。

虽然IB、RoCE和iWARP是不同的协议,但对于用户而言可以使用相同的软件包进行开发,这就是Verbs软件包。如下图是IB、RoCE、iWARP协议与Verbs软件包和应用程序的关系。


通过Verbs开发包,普通用户可以不关注底层的硬件细节,只需要关注业务逻辑层面的实现即可。同时,统一的开发API也增加了应用程序的可移植性。我们可以从这个链接(
https://github.com/linux-rdma/rdma-core)下载Verbs软件包的源代码和示例程序。关于源代码方面的内容,我们在后续章节会详细介绍,本节暂时不做过多介绍。

对于学习者,大多数人估计没有支持RDMA的硬件,所以实战起来可能就有些门槛。幸运的是,在Linux内核中有一个Soft-RoCE模块。这个模块通过软件的方式来模拟RDMA功能,并且也是通过Verbs来进行开发,所以大家可以借助Soft-RoCE来熟悉RDMA相关的开发技术。


至此,我们对高性能通信方面的内容做了一个简要的介绍。通过本节内容,相信大家对RDMA、IB、RoCE和iWARP有了一个相对全面的了解。虽然可能了解的不够深入,但具体的功能特点和区别应该有了一个概要的了解。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言