1.什么是RDMA
RDMA(Remote Direct Memory Access)是指远程直接内存访问,应用程序之间搬运缓冲区里的数据的方法。
- Remote:数据通过网络与远程机器之间进行数据传输。
- Direct:没有内核的参与,有关发送传输的所有内容都卸载到网卡上。
- Memory:在用户空间虚拟内存与网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制。
- Access:send、receive、read、write、atomic(原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。)等操作。
RDMA与传统的网络接口不同,因为它绕过了操作系统内核(它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间,应用程序完成操作以后将权限交还给内核)。这使得RDMA的程序具有以下特点:
- 绝对的最低时延
- 最高的吞吐量
- 最小的CPU足迹(需要CPU参与的地方被最小化)
RDMA的主要优势:
- 零拷贝:应用程序可以在不涉及网络软件堆栈的情况下执行数据传输。数据直接发送和接收到缓冲区,而无需在网络层之间复制。
- 内核绕过:应用程序可以直接从用户空间执行数据传输,而无需内核参与。
- 无需CPU参与:应用程序可以访问远程内存而无需在远程服务器中消耗任何CPU时间。远程内存服务器将被读取,而无需远程进程(或处理器)的任何干预。而且,远程CPU的缓存不会被访问的内存内容填满。
2. RDMA工作原理
传统的TCP/IP通信过程如下:
- 把收到的数据包缓存到系统上,数据包经过处理之后,相应数据被分配到一个TCP连接。
- 接受系统再把主动提高的TCP数据同相应的应用程序联系起来,并将数据从系统缓冲区拷贝到目标存储地址。
由此可见在发送和接受数据的过程中,数据在源端应用层从上向下逐层拷贝封装,目的端从下向上拷贝和解封装,所以比较慢,而且需要CPU参与的次数很多。
RDMA通信过程中,发送和接受、读写操作,都是网卡直接和参与数据传输。已经注册过的内存区域直接进行数据传输,速度快,不需要CPU参与,RDMA网卡接替了CPU的工作,节省下来的资源可以进行其他的运算和服务。
RDMA的工作过程如下:
- 当一个应用执行RDMA读写请求时,不执行任何数据复制。在不需要任何内核内存参与的条件下,RDMA请求从运行在用户空间中的应用中发送到本地网卡。
- 网卡读取缓冲的内容,并通过网络传送到远程网卡。
- 在网络上传输的RDMA信息包含目标机器虚拟内存地址和数据本身。请求完成可以完全在用户空间中处理(通过轮询用户空间的 RDMA 完成队列)。RDMA操作使应用可以从一个远程应用的内存中读取数据或向这个内存写数据。
因此,RDMA可以简单理解为利用相关的硬件和网络技术,网卡可以直接读写远程服务器的内存,最终达到高带宽、低延迟、和低资源利用率的效果。应用程序不需要参与数据传输过程,只需要指定内存读写地址,开启传输并等待传输完成即可。
3.支持RDMA的网络协议
RDMA作为一种host-offload、host-bypass技术,使低延迟、高带宽的直接的内存到内存的数据通信成为了可能。目前支持RDMA的网络协议有:
- InfiniBand(IB):从一开始就支持RDMA的新一代网络协议。由于这是一种新的网络技术,因此需要支持该技术的网卡和交换机。
- RDMA 过融合以太网(RoCE):即 RDMA over Converged Ethernet,允许通过以太网执行 RDMA 的网络协议。这允许在标准以太网基础架构(交换机)上使用 RDMA,只不过网卡必须是支持 RoCE 的特殊的网卡。
- 互联网广域 RDMA 协议(iWARP):即 Internet Wide Area RDMA Protocol,其实也就是 RDMA over TCP,允许通过 TCP 执行 RDMA 的网络协议。这允许在标准以太网基础架构(交换机)上使用RDMA,只不过网卡要求是支持iWARP(如果使用 CPU offload 的话)的网卡。否则,所有 iWARP 栈都可以在软件中实现,但是失去了大部分的 RDMA 性能优势。