RDMA简介
DMA
简单的说一下DMA(Direct Memory Access),直接内存访问。
即通过DMA Enigne 能够将主板上的设备数据不通过CPU直接将数据搬运到内存当中。
DMA的工作信息,可以通过一个简单的图来进行表示:
两个buffer不通过CPU的搬运。而是通过DMA Engine 将数据进行搬运,并且在数据搬运结束之后通知CPU
RDMA
RDMA(Remote Direct Memory Access)即两台或者多台计算机进行通信的时候,从一台主机的内存直接访问到另一台主机(不通过常规的TCP/IP网络栈,也不用借助CPU的计算,只需要注册好双方的内存之后就可以进行内存的数据传输)。
下面还是一张RDMA的解释图:
NIC也就是RDMA的Engine,在实际硬件上面的体现也就是一种特殊的网卡,能够直接支持RDMA特有的网络协议(下面会进行介绍)进行传输的工作。
RDMA的相关优势点
比较原来网络传输采用的TCP/IP协议,RDMA有如下的相关优势:
**原来的TCP/IP的缺点: **传统的TCP/IP技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制移动,给服务器的CPU和内存造成了沉重负担。尤其是网络带宽、处理器速度与内存带宽三者的严重"不匹配性",更加剧了网络延迟效应。
优点:
**零拷贝(Zero-copy):**应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。
内核旁路(Kernel bypass): 数据传输直接在用户层来进行传输,无须进行进入内核态,也不用进行系统内存
不需要CPU干预(No CPU involvement): 一旦应用已经系统上注册了RDMA对应的内存。之后,再进行数据传输就不需要CPU进行干预。也就是不需要再想TCP/IP一样进行拥塞避免等操作。
消息基于事务(Message based transactions): 不像TCP/IP协议一样基于字节流进行传输,RDMA的协议是通过一个消息来进行传输,处理消息和存储消息的位置自然是各种消息队列。
支持分散/聚合条目(Scatter/gather entries support): RDMA原生态支持分散/聚合。也就是说,读取多个内存缓冲区然后作为一个流发出去或者接收一个流然后写入到多个内存缓冲区里去。
RDMA基于消息而不是基于字节流(异步传输)
RDMA在传输数据的时候,主要有这么几个队列起着作用:
发送队列(SQ) Send Queue
接收队列(RQ) Receive Queue
SQ和RQ都统称为任务队列(WQ)
还有一个队列,完成队列CQ中获取工作完成(WC)
具体的消息发送过程可以通过生产者-消费者模型来解释。用一张图来解释这个传输数据的过程:
- Ho