前言
在阅读一篇关于分布式文件系统的存储中,接触到了RDMA这个技术,并对其内容做了一个大致的了解,感觉在速度上面确实会比我们常用的通讯方式要占据一定优势,因此在此记录一下它的大体内容,若后续研究或者技术需要,会再对它进行深入探索。
概述
RDMA是什么
RDMA即Remote Direct Memory Access,远程直接内存访问,即不需要TCP/IP的通讯协议的参与,能够像访问自身内存一样访问远端内存,它是实现在网卡中的一项技术,也就是说是以网卡这一硬件来对外表现的,如果想用这个技术,就需要有这一类的网卡才能够提供相应的支持。
通过DMA的网络传输过程如下图所示
数据会在CPU的支持下从用户空间拷贝至内核空间的缓冲区,然后DMA会将内核缓冲区中的数据经过TCP/IP这一层层的协议传送至网卡中,再由网卡通过物理链路传输至远端的网卡处,再由DMA负责将数据拷贝至内核空间,会经过TCP/IP协议进行解析,由CPU将数据再拷贝至用户空间。
而RDMA则取消了中间经过TCP/IP这协议栈的过程,并且在数据传送的过程中没有CPU的参与,如下图所示。
使用RDMA的数据发送则不需要CPU以及内核态的参与(实现了内核Bypass),数据直接由用户空间拷贝至网卡,然后经过物理链路传输至远端网卡中再直接送入用户空间中。
RDMA write
下面将以RDMA的一个指令为例,来看看RDMA具体是怎么工作的。
发送端的网卡将从SQ中取出WQE即write任务来进行信息的解析,解析出虚拟地址后,在网卡中转换为物理地址,然后从内存中拿到数据,并组装成数据包,通过物理链路发送给接收端网卡,接收端拿到数据包后,解析出目的虚拟地址并转换为本地虚拟地址,解析数据,将数据放置到指定内存区域。接收端会给发送端回复ACK,发送端收到后会再CQ中生成CRE1。之后APP会得到消息写成功信息。
当然在执行之前会进行一个准备阶段,使得发送端能够像访问自己的内存一样直接对远端内存区域进行读写。
其中,
SQ:发送队列
RQ:接收队列
WQE:工作任务
CQ:完成队列
CQE:完成报告