原文:https://zhuanlan.zhihu.com/p/138874738
本想完全靠自己的语言完成这篇概述,然而开篇并没有想象当中的好写,看样子从宏观上概括一个技术比从微观上探究细枝末节要困难不少。本文是以前人们对RDMA技术的介绍为主,加入了一些自己的理解。随着本专栏内容的增加,本篇概述也会更新和逐渐完善。
什么是RDMA?
RDMA( Remote Direct Memory Access )意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的内存。所谓直接,指的是可以像访问本地内存一样,绕过传统以太网复杂的TCP/IP网络协议栈读写远端内存,而这个过程对端是不感知的,而且这个读写过程的大部分工作是由硬件而不是软件完成的。
为了能够直观的理解这一过程,请看下面两个图(图中箭头仅做示意,不表示实际逻辑或物理关系):
![](https://i-blog.csdnimg.cn/blog_migrate/c7a2fab9128d98a35c9108bf6954f33c.png)
传统网络中,“节点A给节点B发消息”实际上做的是“把节点A内存中的一段数据,通过网络链路搬移到节点B的内存中”,而这一过程无论是发端还是收段,都需要CPU的指挥和控制,包括网卡的控制,中断的处理,报文的封装和解析等等。
而RDMA技术除了支持上面的传统收-发操作之外,还支持直接的远程读/写操作。这一过程可以简单的表示成下面的示意图,可以看到,节点B的CPU没有参与这一过程。也就是说节点A可以在节点B的CPU“不知情”的情况下,直接读写它的内存。
![](https://i-blog.csdnimg.cn/blog_migrate/a0bf5588b3b3634b358ce8b8e7091378.png)
RDMA主要应用在高性能计算(HPC)领域和大型数据中心当中,并且设备相对普通以太网卡要昂贵不少(比如Mellanox公司的Connext-X 5 100Gb PCIe网卡市价在4000元以上)。由于使用场景和价格的原因,RDMA与普通开发者和消费者的距离较远,目前主要是一些大型互联网企业在部署和使用。
RDMA技术为什么可以应用在上述场景中呢?这就涉及到它的以下几个特点:
- 0拷贝:指的是不需要在用户空间和内核空间中来回复制数据。
由于Linux等操作系统将内存划分为用户空间和内核空间,在传统的Socket通信流程中CPU需要多次把数据在内存中来回拷贝。而通过RDM