https://blog.csdn.net/qq_21125183/article/details/80563463
在计算中,远程直接内存访问(RDMA)是从一台计算机的内存到另一台计算机的内存的直接内存访问,而不涉及任何一个操作系统。这允许高吞吐量,低延迟的网络,这在大规模并行计算机集群中特别有用。RDMA通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理能力。它消除了外部存储器复制和上下文切换的开销,因而能解放内存带宽和CPU周期用于改进应用系统性能。RDMA支持零拷贝网络,它使网络适配器能够将数据从线路直接传输到应用程序内存或从应用程序内存直接传输到线路,从而无需在应用程序内存和操作系统中的数据缓冲区之间复制数据。这种传输不需要CPU,高速缓存或上下文切换来完成工作,并且传输与其他系统操作并行继续。
RDMA是一种新的内存访问技术,RDMA让计算机可以直接存取其他计算机的内存,而不需要经过处理器耗时的处理。RDMA将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响。
因此,RDMA可以简单理解为利用相关的硬件和网络技术,服务器1的网卡可以直接读写服务器2的内存,最终达到高带宽、低延迟和低资源利用率的效果。如下图所示,应用程序不需要参与数据传输过程,只需要指定内存读写地址,开启传输并等待传输完成即可。RDMA的主要优势总结如下:
1) Zero-Copy:数据不需要在网络协议栈的各个层之间来回拷贝,这缩短了数据流路径。
2) Kernel-Bypass:应用直接操作设备接口,不再经过系统调用切换到内核态,没有内核切换开销。
3) None-CPU:数据传输无须CPU参与,完全由网卡搞定,无需再做发包收包中断处理,不耗费CPU资源。
1.1 传统TCP/IP通信模式
传统的TCP/IP网络通信,数据需要通过用户空间发送到远程机器的用户空间。数据发送方需要讲数据从用户应用空间Buffer复制到内核空间的Socket Buffer中。然后Kernel空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)以及互联网控制消息协议(ICMP)等。数据才被Push到NIC网卡中的Buffer进行网络传输。消息接受方接受从远程机器发送的数据包后,要将数据包从NIC buffer中复制数据到Socket Buffer。然后经过一些列的多层网络协议进行数据包的解析工作。解析后的数据被复制到相应位置的用户应用空间Buffer。这个时候再进行系统上下文切换,用户应用程序才被调用。以上就是传统的TCP/IP协议层的工作。
1.2 传统TCP/IP存在的问题
传统的TPC/IP存在的问题主要是指I/O bottleneck瓶颈问题。在高速网络条件下与网络I/O相关的主机处理的高开销限制了可以在机器之间发送的带宽。这里感兴趣的高额开销是数据移动操作和复制操作。具体来讲,主要是传统的TCP/IP网络通信是通过内核发送消息。Messaging passing through kernel这种方式会导致很低的性能和很低的灵活性。性能低下的原因主要是由于网络通信通过内核传递,这种通信方式存在的很高的数据移动和数据复制的开销。并且现如今内存带宽性相较如CPU带宽和网络带宽有着很大的差异。很低的灵活性的原因主要是所有网络通信协议通过内核传递,这种方式很难去支持新的网络协议和新的消息通信协议以及发送和接收接口。
高性能网络通信历史发展主要有以下四个方面:TCP Offloading Engine(TOE)、User-Net Networking(U-Net)、Virtual interface Architecture(VIA)、Remote Direct Memroy Access(RDMA)。U-Net是第一个跨过内核网络通信的模式之一。VIA首次提出了标准化user-level的网络通信模式,其次它组合了U-Net接口和远程DMA设备。RDMA就是现代化高性能网络通信技术。
2.1 TCP Offloading Engine
在主机通过网络进行通信的过程中,主机处理器需要耗费大量资源进行多层网络协议的数据包处理工作,这些协议包括传输控制协议(TCP)、用户数据报协议(UDP)、互联网协议(IP)以及互联网控制消息协议(ICMP)等。由于CPU需要进行繁重的封装网络数据包协议,为了将占用的这部分主机处理器资源解放出来专注于其他应用,人们发明了TOE(TCP/IP Offloading Engine)技术,将上述主机处理器的工作转移到网卡上。
这种技术需要特定网络接口-网卡支持这种Offloading操作。这种特定网卡能够支持封装多层网络协议的数据包,这个功能常见于高速以太网接口上,如吉比特以太网(GbE)或10吉比特以太网(10GbE)。
2.2 User-Net Networking(U-Net)
U-Net的设计目标是将协议处理部分移动到用户空间去处理。这种方式避免了用户空间将数据移动和复制到内核空间的开销。它的设计宗旨就是移动整个协议栈到用户空间中去,并且从数据通信路径中彻底删除内核。这种设计带来了高性能的提升和高灵活性的提升。U-Net的virtual NI 为每个进程提供了一种拥有网络接口的错觉,内核接口只涉及到连接步骤。传统上的网络,内核控制整个网络通信,所有的通信都需要通过内核来传递。U-Net应用程序可以通过MUX直接访问网络,应用程序通过MUX直接访问内核,而不需要将数据移动和复制到内核空间中去。
RDMA主要有以下三个特性:1.Low-Latency 2.Low CPU overhead 3. high bandwidth
3.1 RDMA 简介
Remote:数据通过网络与远程机器间进行数据传输
Direct:没有内核的参与,有关发送传输的所有内容都卸载到网卡上
Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制
Access:send、receive、read、write、atomic操作
3.2 RDMA基本概念
RDMA有两种基本操作。
Memory verbs: 包括RDMA read、write和atomic操作。这些操作指定远程地址进行操作并且绕过接收者的CPU。
Messaging verbs:包括RDMA send、receive操作。这些动作涉及响应者的CPU,发送的数据被写入由响应者的CPU先前发布的接受所指定的地址。
RDMA传输分为可靠和不可靠的,并且可以连接和不连接的(数据报)。凭借可靠的传输,NIC使用确认来保证消息的按序传送。不可靠的传输不提供这样的保证。然而,像InfiniBand这样的现代RDMA实现使用了一个无损链路层,它可以防止使用链路层流量控制的基于拥塞的损失[1],以及使用链路层重传的基于位错误的损失[8]。因此,不可靠的传输很少会丢弃数据包。
目前的RDMA硬件提供一种数据报传输:不可靠的数据报(UD),并且不支持memory verbs。
3.3 RDMA三种不同的硬件实现
目前RDMA有三种不同的硬件实现。分别是InfiniBand、iWarp(internet Wide Area RDMA Protocol)、RoCE(RDMA over Converged Ethernet)。
目前,大致有三类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性能优势。
3.4 RDMA技术
传统上的RDMA技术设计内核封装多层网络协议并且涉及内核数据传输。RDMA通过专有的RDMA网卡RNIC,绕过内核直接从用户空间访问RDMA enabled NIC网卡。RDMA提供一个专有的verbs interface而不是传统的TCP/IP Socket interface。要使用RDMA首先要建立从RDMA到应用程序内存的数据路径 ,可以通过RDMA专有的verbs interface接口来建立这些数据路径,一旦数据路径建立后,就可以直接访问用户空间buffer。
3.5 RDMA整体系统架构图
上诉介绍的是RDMA整体框架架构图。从图中可以看出,RDMA在应用程序用户空间,提供了一系列verbs interface接口操作RDMA硬件。RDMA绕过内核直接从用户空间访问RDMA 网卡(RNIC)。RNIC网卡中包括Cached Page Table Entry,页表就是用来将虚拟页面映射到相应的物理页面。
3.6 RDMA技术详解
RDMA 的工作过程如下:
1)当一个应用执行RDMA 读或写请求时,不执行任何数据复制.在不需要任何内核内存参与的条件下,RDMA 请求从运行在用户空间中的应用中发送到本地NIC( 网卡)。
2) NIC 读取缓冲的内容,并通过网络传送到远程NIC。
3) 在网络上传输的RDMA 信息包含目标虚拟地址、内存钥匙和数据本身.请求既可以完全在用户空间中处理(通过轮询用户级完成排列) ,又或者在应用一直睡眠到请求完成时的情况下通过系统中断处理.RDMA 操作使应用可以从一个远程应用的内存中读数据或向这个内存写数据。
4) 目标NIC 确认内存钥匙,直接将数据写人应用缓存中.用于操作的远程虚拟内存地址包含在RDMA 信息中。