文章目录
传统的基于Socket套接字(TCP/IP协议栈)的网络通信过程
七、SQ(Send Queue)和RQ(Receive Queue)
九、CQE(Completion Queue Element)
十一、WR(Work Request)和WC(Work Completion)
概述
互联网时代日益增长的数据量的存储需求和海量数据处理需求导致分布式数据库系统的研究已经成为业界最新的热点问题。分布式数据库拥有优秀的扩展性,可以有效利用多核多机的计算和存储能力。同时,因为近年来内存价格的不断降低,操作系统也可以支持更大的地址空间,研发完全采用内存作为的存储引擎的分布式内存数据库得以实现。然而,由于传统的TCP/IP网络协议栈天然的复杂性,使得内存读取速度和网络传输速度的差距越来越大,网络IO替换磁盘IO成为了分布式内存数据库系统中新的瓶颈,影响了分布式系统的扩展性,制约着分布式内存数据库的性能。随着拥有比TCP/IP网络更高的吞吐量和更低的延迟的远程直接数据存取(RDMA)技术的日益成熟,利用RDMA技术改善分布式内存数据库系统中的网络环境的方式变得越来越流行。
那么了解RDMA技术之前,我们先了解下传统的TCP/IP通信的痛点在哪里,然后RDMA针对于这些痛点问题是如何解决的。
传统的基于Socket套接字(TCP/IP协议栈)的网络通信过程
在描述通信过程时的软硬件关系时,我们通常将模型划分为用户空间,Linux内核空间以及硬件。用户空间和Linux内核空间实际上使用的是同一块物理内存,但是处于安全考虑,Linux将内存划分为用户空间和内核空间。用户层没有权限访问和修改内核空间的内存内容,只能通过系统调用陷入内核态再访问或者修改内核空间的内容。
一次典型的Socket通信过程的可以如下图所示进行分层:
一次客户端和服务器发送和接收过程的步骤如下:
- 客户端和服务器通过Socket库提供的接口建立链接,并分别在内存中申请好发送和接收Buffer。
- 客户端通过Socket接口陷入内核态,待发送数据经过TCP/IP协议栈的一层层封装,最后被CPU复制到Socket Buffer(WriteBuffer)中。
- 客户端通过网卡驱动,告知网卡可以发送数据了,网卡将通过DMA(Direct Memory Access,直接存储器访问)从WriteBuffer中复制封装好的数据包到内部缓存中,然后将其发送到物理链路。
- 服务器网卡收到数据包后,将数据包放到Socket Buffer(ReadBuffer)中,然后CPU将通过内核中的TCP/IP协议栈对报文进行层层解析,取出有效的数据。
- 服务器通过Socket接口陷入内核态,CPU将数据从内核空间复制到用户空间。
Socket模型的数据流向大致是像上图这个样子,数据首先需要从用户空间复制一份到内核空间,这一次复制由CPU完成,将数据块从用户空间复制到内核空间的Socket Buffer中。内核中软件TCP/IP协议栈给数据添加各层头部和校验信息。最后网卡会通过DMA从内存中复制数据,并通过物理链路发送给对端的网卡。
而对端是完全相反的过程:硬件将数据包DMA拷贝到内存中,然后CPU会对数据包进行逐层解析和校验,最后将数据复制到用户空间。
上述过程中的关键点是需要CPU参与的把数据从用户空间拷贝到内核空间,以及同样需要CPU全程参与的数据包组装和解析,数据量大的情况下,这将对CPU将造成很大的负担。那么有没有一种解决方案来优化这个通信流程呢?RDMA技术应运而生,那么什么是RDMA呢?
RDMA技术简介
RDMA(Remote Direct Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中服务器端数据处理的延迟而产生的。
同Socket一样,我们简单描述下通信的过程:
- 客户端和服务器分别通过系统调用陷入内核态创建好通信所需要的内存资源。
- 服务器通知硬件准备接收数据,告诉硬件将接收到的数据放在哪片内存中。
- 客户端通知硬件发送数据,告诉硬件待发送数据位于哪片内存中。
- 客户端RDMA网卡从内存中搬移数据,组装报文发送给对端。
- 服务器收到报文,对其进行解析并通过DMA将有效载荷写入内存。然后以某种方式通知上层应用,告知其数据已接收并妥善存放到指定位置。
这一过程中的数据流向大致如上图所示。通过和Socket的对比,我们可以明显看到,数据收发绕过了内核并且数据交换过程并不需要CPU参与,报文的组装和解析是由硬件完成的。
通过上面的对比,我们可以明显的体会到RDMA的优势,既将CPU从数据包封装和解析中解放出来,又减少了CPU拷贝数据的功率和时间损耗。
RDMA技术的特点
一、Kernel bypass(内核旁路)
在数据传输过程中,由于不涉及操作系统,因此应用程序可以直接从用户空间直接进行数据传输,从而减少了上下文切换和延迟。
二、Zero-copy(零拷贝)
应用程序可以将数据直接放在目标应用程序的内存缓冲区中,并将数据直接接收到缓冲区中,而无需在网络层之间复制数据。这将减少不必要的缓冲区传输。
三、No CPU involvement(不涉及CPU)
应用程序无需使用CPU即可访问远程内存。在传统的网络接口卡(NIC)中,CPU必须将数据移入和移出网络,但在RDMA中,仅需要CPU来进行信令设置和完成,并且数据将直接放入远程内存中。
因此,RDMA有助于提高吞吐量和减少延迟。我们可以在需要低延迟(例如高性能计算(HPC))或高带宽(例如云计算HPC)的应用程序中使用RDMA。
RDMA的标准协议
RDMA本身指的是一种技术,具体协议层面,包含Infiniband(IB),RDMA over Converged Ethernet(RoCE)和internet Wide Area RDMA Protocol(iWARP)。三种协议都符合RDMA标准,使用相同的上层接口,在不同层次上有一些差别。
上图对于几种常见的RDMA技术的协议层次做了非常清晰的对比。
一、Infiniband介绍
Infiniband(直译为“无限带宽”技术,缩写为IB)是一个用于高性能计算的计算机网络通信标准,它具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。InfiniBand也用作服务器与存储系统之间的直接或交换互连,以及存储系统之间的互连。
与目前计算机的I/O子系统不同,InfiniBand是一个功能完善的网络通信系统。InfiniBand贸易组织把这种新的总线结构称为I/O网络,并把它比作开关,因为所给信息寻求其目的地址的路径是由控制校正信息决定的。InfiniBand使用的是网际协议版本6的128位地址空间,因此它能提供近乎无限量的设备扩展性。
通过InfiniBand传送数据时,数据是以数据包方式传输,这些数据包会组合成一条条信息。这些信息的操作方式可能是远程直接内存存取的读写程序,或者是通过信道接受发送的信息,或者是多点传送传输。就像大型机用户所熟悉的信道传输模式,所有的数据传输都是通过信道适配器来开始和结束的。每个处理器(例如个人电脑或数据中心服务器)都有一个主机通道适配器,而每个周边设备都有一个目标通道适配器。通过这些适配器交流信息可以确保在一定服务品质等级下信息能够得到有效可靠的传送。
二、RoCE
通常,有两个RoCE版本:RoCE v1和RoCE v2。这取决于所使用的网络适配器或卡。
RoCE v1:RoCE v1协议是以太网链路层协议,允许同一以太网广播域(VLAN)中的两个主机进行通信。它使用以太类型0x8915,对于标准以太网帧,该帧长度限制为1500字节,对于以太网巨型帧,其帧长度限制为9000字节。
RoCE v2:RoCE v2协议克服了版本1绑定到单个广播域(VLAN)的限制。通过更改数据包封装以包括IP和UDP标头,RoCE v2现在可以在L2和L3网络中使用。这启用了第3层路由,该路由将RDMA带到具有多个子网的网络,以实现出色的可伸缩性。因此,RoCE v2也被视为可路由RoCE(RRoCE)。由于RoCE v2的到来,现在还可以进行IP多播。
Soft-RoCE
RoCE的软件实现称为Soft-RoCE,它为所有启用了以太网的服务器提供RoCE技术。上图描绘了通过网络接口卡(NIC)的RDMA堆栈的完整实现。Soft-RoCE具有ib_rxe内核模块和librxe用户空间库。Soft-RoCE驱动程序可用于Linux平台。安装Mellanox OFED 4.0或上游将自动提供Soft-RoCE用户空间库和内核模块。Soft-RoCE帮助数据中心具有以太网适配器且不具有RDMA硬件的服务器连接到利用基于硬件的RoCE的高性能存储单元,从而使它们能够有效地传递数据。它允许具有以太网适配器的系统与具有基于硬件的RoCE或Soft-RoCE的另一个系统一起运行。
三、iWARP
iWRAP - Internet Wide Area RDMA Protocol,或者叫RDMA over TCP,IETF在2007年发布(RFC5040和RFC5041)。业界有两家厂商各自在主推iWRAP和RoCE,Chelsio主推iWRAP,而Mellanox则在融合网络主推RoCE,两家都有关于RoCE vs iWRAP的对比白皮书。
iWRAP的RDMA报文是封装在TCP传输层之上。利用TCP协议,它不必在依赖底层的L2Qos就可以实现无损传输,天生就支持路由组网。而RoCE直到最近的V2版本才支持路由。Chelsio的白皮书成文较早,其对RoCE的主要攻击点是不支持路由功能,在现在这一论据已经失去意义了。
需要注意的是,上述几种协议都需要专门的硬件(网卡)支持。
RDMA如何工作
在讲解RDMA如何工作之前,先介绍一下相应的名词,这些名词会在之后的RDMA工作流程中频繁出现。
一、Fabric
所谓Fabric,就是支持RDMA的局域网(LAN)。
二、CA(Channel Adapter)
CA是Channel Adapter(通道适配器)的缩写。那么,CA就是将系统连接到Fabric的硬件组件。在IBTA中,一个CA就是IB子网中的一个终端结点(End Node)。分为两种类型,一种是HCA, 另一种叫做TCA, 它们合称为xCA。其中, HCA(Host Channel Adapter)是支持"verbs"接口的CA, TCA(Target Channel Adapter)可以理解为"weak CA", 不需要像HCA一样支持很多功能。而在IEEE/IETF中,CA的概念被实体化为RNIC(RDMA Network Interface Card), iWARP就把一个CA称之为一个RNIC。
简言之,在IBTA阵营中,CA即HCA或TCA;而在iWARP阵营中,CA就是RNIC。总之,无论是HCA、 TCA还是RNIC,它们都是CA, 它们的基本功能本质上都是生产或消费数据包(packet)。
三、Verbs
在RDMA的持续演进中,有一个组织叫做OpenFabric Alliance所做的贡献可谓功不可没。Verbs这个词不好翻译,大致可以理解为访问RDMA硬件的“一组标准动作”。每一个Verb可以理解为一个Function。
四、WQE(Work Queue Element)
WQE可以认为是一种“任务说明”,这个工作请求是软件下发给硬件的,这份说明中包含了软件所希望硬件去做的任务以及有关这个任务的详细信息。比如,某一份任务是这样的:“我想把位于地址0x12345678的长度为10字节的数据发送给对面的节点”,硬件接到任务之后,就会通过DMA去内存中取数据,组装数据包,然后发送。
五、WQ(Work Queue)
WQ(Work Queue)是一个储存工作请求的队列里面存放着WQE(Work Queue Element)。WQ这个队列总是由软件向其中增加WQE(入队),硬件从中取出WQE,这就是软件给硬件“下发任务”的过程。
六、Work Queue Pair(Queue Pair)
1.由SEND队列(SQ)和RECEIVE队列(RQ)组成。
2.分配和控制基于队列对。
3.所有流量都通过工作队列。
七、SQ(Send Queue)和RQ(Receive Queue)
任何通信过程都要有收发两端,QP就是一个发送工作队列和一个接受工作队列的组合,这两个队列分别称为SQ(Send Queue)和RQ(Receive Queue)。
SQ专门用来存放发送任务,RQ专门用来存放接收任务。在一次SEND-RECV流程中,发送端需要把表示一次发送任务的WQE放到SQ里面。同样的,接收端软件需要给硬件下发一个表示接收任务的WQE,这样硬件才知道收到数据之后放到内存中的哪个位置。上文我们提到的Post操作,对于SQ来说称为Post Send,对于RQ来说称为Post Receive。
在RDMA技术中通信的基本单元是QP,而不是节点。如下图所示,对于每个节点来说,每个进程都可以使用若干个QP,而每个本地QP可以“关联”一个远端的QP。我们用“节点A给节点B发送数据”并不足以完整的描述一次RDMA通信,而应该是类似于“节点A上的QP1给节点C上的QP3发送数据”。
每个节点的每个QP都有一个唯一的编号,称为QPN(Query Pair Number),通过QPN可以唯一确定一个节点上的QP。
八、SRQ(Shared Receive Queue)
Shared Receive Queue简称SRQ,意为共享接收队列。概念很好理解,就是一种几个QP共享同一个RQ时,我们称其为SRQ。
使用RQ的情况要远远小于使用SQ,而每个队列都是要消耗内存资源的。当我们需要使用大量的QP时,可以通过SRQ来节省内存。
如下图所示,QP1~QP3一起使用同一个RQ:
九、CQE(Completion Queue Element)
CQE跟WQE是相反的概念,如果WQE是软件下发给硬件的“任务书”的话,那么CQE就是硬件完成任务之后返回给软件的“任务报告”。CQE中描述了某个任务是被正确无误的执行,还是遇到了错误,如果遇到了错误,那么错误的原因是什么。
十、CQ(Completion Queue)
而CQ就是承载CQE的容器——一个先进先出的队列。
每个CQE都包含某个WQE的完成信息,他们的关系如下图所示:
下面我们把CQ和WQ(QP)放在一起,看一下一次SEND-RECV操作中,软硬件的互动
接收端应用以WQE的形式下发一次接收任务。
- 接收端硬件从RQ中拿到任务书,准备接收数据。
- 发送端应用以WQE的形式下发一次SEND任务。
- 发送端硬件从SQ中拿到任务书,从内存中拿到待发送数据,组装数据包。
- 发送端网卡将数据包通过物理链路发送给接收端网卡。
- 接收端收到数据,进行校验后回复ACK报文给发送端。
- 接收端硬件将数据放到WQE中指定的位置,然后生成“任务报告”CQE,放置到CQ中。
- 接收端应用取得任务完成信息。
- 发送端网卡收到ACK后,生成CQE,放置到CQ中。
- 接收端应用取得任务完成信息。
至此,通过WQ和CQ这两种媒介,两端软硬件共同完成了一次收发过程。
十一、WR(Work Request)和WC(Work Completion)
WR全称为Work Request,意为工作请求;WC全称Work Completion,意为工作完成。这两者其实是WQE和CQE在用户层的“映射”。因为应用是通过调用协议栈接口来完成RDMA通信的,WQE和CQE本身并不对用户可见,是驱动中的概念。用户真正通过API下发的是WR,收到的是WC。
WR/WC和WQE/CQE是相同的概念在不同层次的实体,他们都是“任务书”和“任务报告”。关系如下图所示
总结
每一个技术都有产生的原因,RDMA 就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它消除了数据包在用户空间和内核空间复制移动和上下文切换的开销,因而能解放内存带宽和CPU周期用于改进应用系统性能。这在大规模并行计算机集群中特别有用。目前分布式计算系统的越来越普及,这门新兴的技术会越来越流行。
本文主要理解RDMA是什么,又是怎么带来性能优化就够了,RDMA是一个非常复杂的技术涉及软硬件,后续会出个系列文章来详细描述。下面参考资料列出了一些RDMA的资料,想深入理解可以提前看看。
参考资料:
- https://www.mellanox.com/related-docs/prod_software/RDMA_Aware_Programming_user_manual.pdf
- https://www.snia.org/sites/default/files/files2/files2/SDC2013/presentations/Hardware/DavidDeming_IBA_Software_RDMA.pdf
- http://www.reports.ias.ac.in/report/12829/understanding-the-concepts-and-mechanisms-of-rdma
- https://www.mellanox.com/related-docs/whitepapers/WP_RoCE_vs_iWARP.pdf
- https://www.snia.org/sites/default/files/ESF/RoCE-vs.-iWARP-Final.pdf
- https://cw.infinibandta.org/document/dl/7148
- https://community.mellanox.com/s/article/roce-v2-considerations
- https://zhuanlan.zhihu.com/p/141267386

微信公众号名称:技术茶馆
微信公众号ID : Night_ZW