理解 RDMA
在数据中心领域,远程直接内存访问(英語:remote direct memory access,RDMA)是一种绕过远程主机操作系统内核访问其内存中数据的技术,由于不经过操作系统,不仅节省了大量CPU资源,同样也提高了系统吞吐量、降低了系统的网络通信延迟,尤其适合在大规模并行计算机集群中有广泛应用。在基于NVMe over Fabric的数据中心中,RDMA可以配合高性能的NVMe SSD构建高性能、低延迟的存储网络。
从 DMA 到 RDMA
在理解 RDMA 之前,我们先要回顾一下 DMA。
DMA,直接内存访问,是电脑科学中的一种内存访问技术。它允许某些电脑内部的硬件子系统(电脑外设),可以独立地直接读写系统内存,而不需中央处理器(CPU)介入处理 。在同等程度的处理器负担下,DMA是一种快速的数据传送方式。很多硬件的系统会使用DMA,包含硬盘控制器、绘图显卡、网卡和声卡。
在 DMA 出现之前,读取 IO 设备的数据需要完全依赖 CPU,IO 设备在有数据可读的时候,会触发一个硬件中断,CPU 放下手头的工作,保存工作场景的上下文,进入中断处理程序,且 IO 设备占用总线,CPU 读取总线,中断处理完成后再恢复之前正在执行的任务的上下文。DMA 其实就是引入了一个 DMA 控制器,让 IO 设备经过控制器直接向内存写入数据,不需要让 CPU 处理中断,消除了 CPU 处理中断的开销,节约了 CPU 宝贵的时钟周期。
RDMA 顾名思义,是远程 DMA,但是 DMA 是 IO 设备访问内存,RDMA 的两个主要对象不再是通过总线相连,并且也不是 IO 设备。RDMA 是一台计算机访问另一台计算机的内存。
简单对比一下 DMA 与 RDMA 的过程。
- DMA:IO 设备 -> DMA 控制器 -> 内存
- RDMA:远端计算机某操作 -> 远端计算机网卡 -> 某网络 -> 本地计算机网卡 -> DMA 控制器 -> 内存
可以看出,可以把远端计算机到本机网卡一体化视作一台 IO 设备,再通过 DMA 的方式写入本机内存,不需要本机的 CPU 参与这个过程。
RDMA How to
RDMA 恰恰是 InfiniBand 的一个重要应用。
很明显,RDMA 的过程有网卡参与,并且这些网卡需要一些专用的控制逻辑,无法不依赖专用网卡就很轻松地实现。这时候就引入了 InfiniBand 架构。
Mellanox 提供了基于 IB 开源的 rdma 内核拓展 rdma-core,并且封装了各语言可用的库。可以使用该拓展实现基于 IB 的 RDMA 通讯。
下面会尝试基于 rdma-core 的 python 封装在 IB 网络上实现一个 RDMA demo。