RDMA与传统网络通信(Socket)的区别

传统网络通信(Socket)

在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX  BSD的套接字(socket),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket。无论编写客户端程序还是服务端程序,系统都要为每个TCP连接都要创建一个socket句柄。这样导致了每次传输通信,都要经过OS和协议栈的管理,因此不管是Socket同步通信还是异步通信,都会存在CPU占用过高的现象。


传统网络通信过程如下:发送端首先按照TCP/IP协议包装数据,将要发送的数据包缓存到网卡上等待传输。传输完成后,先把收到的数据包缓存到系统上,数据包经过处理后,相应数据被分配到一个TCP 连接。然后接收系统再把主动提供的TCP 数据同相应的应用程序联系起来,并将数据从系统缓冲区拷贝到目标存储地址。这样,制约网络速率的因素就出现了:应用通信强度不断增加和主机CPU 在内核与应用存储器间处理数据的任务繁重使系统要不断追加主机CPU 资源,配置高效的软件并增强系统负荷管理。所以想要提升性能的关键问题就是:消除主机CPU 中不必要的频繁数据传输,减少通信对CPU的占用。RDMA就是由此来优化通信性能。

RDMA最早专属于infiniband架构。在网络融合的大趋势下出现的RoCE,使高速、超低延时、极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上。


对比传统DMA的内部总线IO,RDMA通过网络在两个端点的应用软件之间实现buffer的直接传递;而对比传统的网络传输,RDMA又无需操作系统和协议栈的介入。RDMA可以轻易实现端点间的超低延时、超高吞吐量传输,而且基本不需要CPU、OS的资源参与,在高速网络环境下,不必再为网络数据的处理和搬移耗费过多资源。一言概之,RDMA三大特性:CPU offload 、kernel bypass、zero-copy。   

在Infiniband/RDMA的模型中,核心“以服务为中心”,围绕一个基本问题:如何实现应用之间最简单、高效和直接的通信。RDMA提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需OS和协议栈的介入
消息服务建立在通信双方本端和远端应用之间创建的channel-IO连接之上。当应用需要通信时,就会创建一条Channel连接,每条Channel的首尾端点是两对Queue Pairs(QP),每对QP由Send Queue(SQ)和Receive Queue(RQ)构成,这些队列中管理着各种类型的消息。QP会被映射到应用的虚拟地址空间,使得应用直接通过它访问RNIC。除了QP描述的两种基本队列之外,RDMA还提供一种队列-Complete Queue(CQ),CQ用来知会用户WQ上的消息已经被处理完。
RDMA提供了一套software transport interface,方便用户创建传输请求-Work Request(WR),WR中描述了应用希望传输到Channel对端的消息内容。WR通知给QP中的某个队列-Work Queue(WQ)。在WQ中,用户的WR被转化为Work Queue Ellement(WQE)的格式,等待RNIC的异步调度解析,并从WQE指向的buffer中拿到真正的消息发送到Channel对端。