文章目录
阅读指南: 本文较长,请细心阅读,其中3.1节可以跳过不读。对RDMA概念有所了解的,可以直接从3.2节开始阅读。
1 传统通信模式
使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket。无论编写客户端程序还是服务端程序,系统都要为每个TCP连接都要创建一个socket句柄。这样导致了每次传输通信,都要经过OS和协议栈的管理,因此不管是Socket同步通信还是异步通信,都会存在CPU占用过高的现象。
1.1传统网络通信过程
- 数据发送方需要讲数据从用户应用空间Buffer复制到内核空间的Socket Buffer中
- 然后Kernel空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作
- 数据被Push到NIC网卡中的Buffer进行网络传输
- 消息接受方接受从远程机器发送的数据包后,要将数据包从NIC buffer中复制数据到Socket Buffer
- 然后经过一些列的多层网络协议进行数据包的解析工作
- 解析后的数据被复制到相应位置的用户应用空间Buffer
- 这个时候再进行系统上下文切换,用户应用程序才被调用
可以看出传统的通信模式会导致重复的数据拷贝、上下文切换、CPU处理
2 RDMA基本原理与优势
2.1 基本原理
RDMA是一种新的直接内存访问技术,RDMA让计算机可以直接存取其他计算机的内存,而不需要经过处理器的处理。RDMA将数据从一个系统快速移动到远程系统的内存中,而不对操作系统造成任何影响。
RDMA:
Remote:数据通过网络与远程机器间进行数据传输
Direct:没有内核的参与,有关发送传输的所有内容都卸载到网卡上
Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制
Access:send、receive、read、write、atomic操作
传统的TCP/IP通信,发送和接收数据的过程中,都是在源端应用层数据从上向下逐层拷贝封装,目的端从下向上拷贝和解封装,所以比较慢,而且需要CPU参与的次数很多。RDMA通信过程中,发送和接收,读/写操作中,都是RNIC直接和参与数据传输的已经注册过的内存区域直接进行数据传输,速度快,不需要CPU参与,RDMA网卡接替了CPU的工作,节省下来的资源可以进行其它运算和服务。
更直观的对比图图:
可以看到传统的方法需要经过用户态->内核->硬件。
而RDMA直接是只经过用户态,数据的存取是通过RDMA硬件直接操作内存的。
使用RDMA的优势如下:
- 零拷贝(Zero-copy): 应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。<