优质博文:IT-BLOG-CN
一、简介
RDMA(remote direct memory access)
即远端直接内存访问,是一种高性能网络通信技术,具有高带宽、低延迟、无CPU
消耗等优点。 主要解决网络传输中服务器端数据处理的延迟问题。
Remote
:数据通过网络与远程机器间进行数据传输;
Direct
:没有内核的参数,有关发送传输的所有内容都卸载到网卡上;
Memory
:在用户空间虚拟内存与RNIC
网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制;
Access
:send/recevie/read/write/atomic
操作;
二、传统通信模式
使用TCP/IP
协议的应用程序通常采用应用编程接口:UNIX BSD
的套接字socket
,来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket
。无论编写客户端程序还是服务端程序,系统都要为每个TCP
连接都要创建一个socket
句柄。这样导致了每次传输通信,都要经过OS
和协议栈的管理,因此不管是Socket
同步通信还是异步通信,都会存在CPU
占用过高的现象,并且需要额外的数据处理,已经无法满足更快,更高效和可扩展性的网络需求。
传统网络通信模式的流程:
【1】数据发送方需要讲数据从用户应用空间Buffer
复制到内核空间的Socket Buffer
中;
【2】然后Kernel
空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作;
【3】数据被Push
到NIC
网卡中的Buffer
进行网络传输;
【4】消息接受方接受从远程机器发送的数据包后,要将数据包从NIC buffer
中复制数据到Socket Buffer
;
【5】然后经过一些列的多层网络协议进行数据包的解析工作;
【6】解析后的数据被复制到相应位置的用户应用空间Buffer
;
【7】这个时候再进行系统上下文切换,用户应用程序才被调用;
三、RDMA
RDMA
就是为了解决网络传输中服务器端数据处理的延迟而产生的,无需使用CPU
,就可以从一个主机或服务器的内存直接访问另一个主机或服务器内存。这样既提高了宽带又降低了延迟、抖动和CPU
消耗。RDMA
可以简单理解为利用相关的硬件和网络技术,服务器A的网卡可以直接读服务器B的内存。如下图应用程序不需要参与数据传输过程,只需要指定内存读写地址,开启传输并等待传输完成即可。
使用RDMA
的优势如下:
【1】零拷贝Zero-copy
: 应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。
【2】内核旁路Kernel bypass
: 应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。
【3】不需要CPU
干预No CPU involvement
: 应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU
。远程主机内存能够被读取而不需要远程主机上的进程或CPU
参与。远程主机的CPU
的缓存cache
不会被访问的内存内容所填充。
【4】消息基于事务Message based transactions
: 数据被处理为离散消息而不是流,消除了应用程序将流切割为不同消息/事务的需求。
【5】支持分散/聚合条目Scatter/gather entries support
: RDMA
原生态支持分散/聚合。也就是说,读取多个内存缓冲区然后作为一个流发出去或者接收一个流然后写入到多个内存缓冲区里去。
四、RDMA网络
目前,大致有三类RDMA
网络,分别是Infiniband
/RoCE
/iWARP
。其中,Infiniband
是一种专为RDMA
设计的网络,从硬件级别保证可靠传输,而RoCE
和iWARP
都是基于以太网的RDMA
技术,支持相应的verbs
接口。
InfiniBand: 采用Cut-Through
转发模式,减少转发时延;基于Credit
的流控机制,保证无丢包;硬件卸载;Buffer
尽可能小,减少报文被缓冲的时延。
iWARP(RDMA over TCP/IP): 利用成熟的IP
网络,继承RDMA
的优点,TCP/IP
硬件实现成本高,但如果采用传统IP
网络的丢包策略对性能影响大。
RoCE: InfiniBand Trade Association(IBTA)
标准中定义的网络协议,允许通过以太网络使用RDMA
。可以看作是RDMA
技术在数据中心、云、存储和虚拟环境中的应用。RoCE
协议存在RoCEv1
和RoCEv2
两个版本,这取决于所使用的网络适配器和网卡。RoCE v1
是基于以太网链路层实现的RDMA
协议(交换机需要支持PFC
等流控技术,在物理层保证可靠传输),允许在同一个VLAN
中的两台主机进行通信。RoCE v1
协议在以太层的typeID
是0x8915
。RoCE v2
克服了RoCE v1
绑定到单个VLAN
的限制。通过改变数据包封装,包括IP
和UDP
标头,RoCE v2
现在可以跨L2
和L3
网络使用。
RDMA API(Verbs)主要有两种: 一个名为OpenFabric Alliance
的组织提供了RDMA
传输的一系列Verbs API
,开发了OFED(Open Fabric Enterprise Distribution)
协议栈,支持多种RDMA
传输层协议。RDMA
应用和RNIC(RDMA-aware Network Interface Controller)
之间的传输接口层Software Transport Interface
被称为Verbs
或RDMA API
【1】内存Verbs
也叫One-SidedRDMA
。包括RDMA Reads
/RDMA Atomic
这种模式下的RDMA
访问完全不需要远端机的任何确认。
【2】消息Verbs
也叫Two-SidedRDMA
。包括RDMA Send
/RDMA Receive
这种模式下的RDMA
访问需要远端机CPU
的参与。
在实际中,
SEND/RECEIVE
多用于连接控制类报文,而数据报文多是通过READ/WRITE
来完成的。
RDMA
是基于消息的数据传输协议(而不是基于字节流的传输协议),所有数据包的组装都在RDMA
硬件上完成的,也就是说OSI
模型中的下面4层(传输层,网络层,数据链路层,物理层)都在RDMA
硬件上完成。
五、RDMA 工作流程
Memory Registration(MR)
内存注册:创建两个key
(local
和remote
)指向需要操作的内存区域,注册的keys
是数据传输请求的一部分。同时,RDMA
硬件对用来做数据传输的内存是有特殊要求的。
【1】在数据传输过程中,应用程序不能修改数据所在的内存。
【2】操作系统不能对数据所在的内存进行page out
操作,物理地址和虚拟地址的映射必须是固定不变的。
Queues
队列:RDMA
一共支持三种队列,发送队列SQ
和接收队列RQ
,完成队列CQ
。其中,SQ
和RQ
通常成对创建,被称为Queue Pairs(QP)
。RDMA
是基于消息的传输协议,数据传输都是异步操作。RDMA
操作其实很简单,可以理解为:
【1】Host
提交工作请求WR
到工作队列WQ
: 工作队列包括发送队列SQ
和接收队列CQ
。工作队列的每一个元素叫做WQE
, 也就是WR
。
【2】Host
从完成队列CQ
中获取工作完成WC
: 完成队列里的每一个叫做CQE
,也就是WC
。
【3】具有RDMA
引擎的硬件hardware
就是一个队列元素处理器。RDMA
硬件不断地从工作队列WQ
中去取工作请求WR
来执行,执行完了就给完成队列CQ
中放置工作完成WC
。
从生产者-消费者的角度理解:
【1】Host
生产WR
, 把WR
放到WQ
中;
【2】RDMA
硬件消费WR
;
【3】RDMA
硬件生产WC
, 把WC
放到CQ
中去;
【4】Host
消费WC
;
Send/Recv操作: SEND/RECEIVE
是双边操作,即需要通信双方的参与,并且RECEIVE
要先于SEND
执行,这样对方才能发送数据,当然如果对方不需要发送数据,可以不执行RECEIVE
操作,因此该过程和传统通信相似,区别在于RDMA
的零拷贝网络技术和内核旁路,延迟低,多用于传输短的控制消息。
read/write操作:
【1】RDMA
读操作本质上就是Pull
操作, 把远程系统内存里的数据拉回到本地系统的内存里。接收方必须提供虚拟地址和目标存储内存的remote_key
。接收方需要初始和接受提醒通知,发送方是完全被动的,并且不会接受任何通知。
【2】RDMA
写操作本质上就是Push
操作,把本地系统内存里的数据推送到远程系统的内存里。发送方必须提供虚拟地址和目标读取内存的remote_key
。发送方需要初始和接受提醒通知,接受方是完全被动的,并且不会接受任何通知。
RDMA工作流程: 要使用RDMA
首先要建立从RDMA
到应用程序内存的数据路径 ,可以通过RDMA
专有的verbs interface
接口来建立这些数据路径,一旦数据路径建立后,就可以直接访问用户空间buffer
。
【1】初始化context
注册内存域;
【2】建立RDMA
连接;
【3】通过SEND/RECEIVE
操作,C/S
交换包含RDMA memory region key
的MSG_MR
消息(一般是客户端先发送);
【4】通过WRITE/READ
操作,进行数据传输(单边操作);
【5】发送MSG_DONE
消息,关闭连接;
消息服务建立在通信双方本端和远端应用之间创建的Channel-IO
连接之上。当应用需要通信时,就会创建一条Channel
连接,每条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 Element(WQE)
的格式,等待RNIC
的异步调度解析,并从WQE
指向的Buffer
中拿到真正的消息发送到Channel
对端。
RDMA双边操作(send/receive): 对于双边操作为例,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
;
【5】双边操作与传统网络的底层buffer pool
类似,收发双方的参与过程并无差别,区别在零拷贝、kernel bypass
,实际上传统网络中一些高级的网络SOC
已经实现类似功能。对于RDMA
,这是一种复杂的消息传输模式,多用于传输短的控制消息;
RDAM单边操作(read): READ
和WRITE
是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信。对于操作发起端,数据的读或写都通过在RNIC
与应用Buffer
之间完成,再由远端RNIC
封装成消息返回到本端。对于单边操作,以B对A的read
操作为例,数据的流程如下:
【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
与传统网络传输的最大不同,只需提供直接访问远程的虚拟地址,无须远程应用的参与其中,这种方式适用于批量数据传输。
六、如何实现RoCE
通常,为了实现RoCE
,可以安装支持RoCE
的网卡或卡驱动程序。所有以太网NIC
都需要RoCE
网络适配器卡。RoCE
驱动程序在Red Hat
、Linux
、Microsoft Windows
和其他常见操作系统中使用。RoCE
有两种可用方式:对于网络交换机,可以选择使用支持PFC
(优先流控制)操作系统的交换机;对于机架服务器或主机,需要使用网卡。
RoCE 的好处:
【1】低CPU
占用率: 访问远程交换机或服务器的内存,无需消耗远程服务器上的CPU
周期,从而可以充分利用可用带宽和更高的可伸缩性。
【2】零复制: 向远程缓冲区发送数据和接收数据。
【3】高效: 由于RoCE
改善了延迟和吞吐量,网络性能得到了很大提高。
【4】节省成本: 借助RoCE
,无需购买新设备或更换以太网基础设施即可处理大量数据,从而大大节省了公司的资本支出。
七、RoCE与iWARP/InfiniBand的区别
RDMA
最早在Infiniband
传输网络上实现,技术先进,但是价格高昂,后来业界厂家把RDMA
移植到传统Ethernet
以太网上,降低了RDMA
的使用成本,推动了RDMA
技术普及。在Ethernet
以太网上,根据协议栈融合度的差异,分为iWARP
和RoCE
两种技术,而RoCE
又包括RoCEv1
和RoCEv2
两个版本(RoCEv2
的最大改进是支持IP
路由),各RDMA
网络协议栈的对比如下图所示。
Infiniband
支持RDMA
的新一代网络协议。由于这是一种新的网络技术,因此需要支持该技术的NIC
和交换机。
RoCE
一个允许在以太网上执行RDMA
的网络协议。其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是InfiniBand
标头。这支持在标准以太网基础设施(交换机)上使用RDMA
。只有网卡应该是特殊的,支持RoCE
。
iWARP
一个允许在TCP
上执行RDMA
的网络协议。IB
和RoCE
中存在的功能在iWARP
中不受支持。这支持在标准以太网基础设施(交换机)上使用RDMA。只有网卡应该是特殊的,并且支持iWARP
(如果使用CPU
卸载),否则所有iWARP
堆栈都可以在软件中实现,并且丧失了大部分RDMA
性能优势。
InfiniBand | iWARP | RoCE | |
---|---|---|---|
标准组织 | IBTA | IETF | IBTA |
性能 | 最好 | 稍差(受TCP影响) | 与IB相当 |
成本 | 高 | 中 | 低 |
网卡厂商 | Mellanox 40Gbps | Chelsio 10Gbps | Mellanox-40Gbps Emulex-10/40Gbps |
RoCE
和iWARP
,一个是基于无连接协议UDP
,一个是基于面向连接的协议(如TCP
)。RoCEv1
只能局限在一个二层广播域内,而RoCEv2
和iWARP
都能够支持三层路由。相比RoCE
,在大型组网的情况下,iWARP
的大量TCP
连接会占用大量的额内存资源,对系统规格要求更高。另外,RoCE
支持组播,而iWARP
还没有相关的标准定义。
RoCE
适配器只能与其他RoCE
适配器通信,如果混合适配器类型配置的话,例如RoCE
适配器与iWARP
适配器组合,都可能会恢复为传统的TCP/IP
连接。
在数据中心中运行RDMA
,可以减轻数据移动的负担,并为应用程序提供更高的CPU
资源可用性。RoCE
协议可以从RDMA
的功能中受益,而无需更改其网络基础架构。通过减少以太网延迟和CPU
开销,RoCE
可以提高搜索、存储、数据库和高事务处理率应用程序的性能。通过提高CPU
效率和应用程序性能,RoCE
可以减少所需的服务器数量,从而节省能源,并减少基于以太网的数据中心的占用空间。