RDMA初探(DMA/RDMA)

在多机训练场景下, 如何加速多机间的数据交换是绕不开的话题, 作者之前负责的集群是以IB网络为载体, 但由于其昂贵的成本及超高的专业性往往让人退而却步,基于以太网的RoCE则具有很高的性价比。
作者经过一段时间的学习及落地,也算是对RoCE(英文读音类Rocky)技术有些了解,简单记录一下。

说到RoCE, 其实是个很大的范畴, 在作者学习的过程中会出现一千个疑问, 无奈作者是个细节控, 必须说服自己。
作者尽力从最基础的底层网卡 -> DMA -> RDMA -> RoCE来铺开。
作者也不是网络工程专业出身, 整体还是非常复杂的,作者将更加聚焦于列出困惑,
比如,有哪些点作者花了比较长的时间去佐证、哪些点跟以往的认识有很大出入等等问题。
可细可简。

DMA

网卡通过 DMA 直接将接收到的数据包写入主机内存中的 Rx Ring Buffer,无需 CPU 介入。
数据包存储位置:由描述符指向的 sk_buff 结构(Linux 内核中表示套接字缓冲区的数据结构)。

没有DMA时的NIC到Memory

有DMA时的NIC到Memory

问题:
为什么网卡可以直接通过DMA写入到主存中?

Linux内核有一个通用的DMA引擎接口,DMA engine驱动实现这个接口即可。
如mellanox 网卡, 包括大多数的 nvidia datacenter GPU硬件层内部集成了DMA的硬件,符合linux内核的DMA引擎接口,
因此可以操作主存.

回到话题, DMA是单机上的操作,如果想在多机也实现offload CPU, 那就是RDMA(remote DMA)

RDMA

首先要明白,RDMA是一种用于多机间的高性能网络通信技术, 在多机之间的数据传输中通常有TCP/IP, 有了TCP/IP后,为什么还需要RDMA?

最主要的原因还是2个:

  • 一、TCP/IP 协议栈处理带来数十微秒的时延

TCP 协议栈在接收/发送报文时,内核需要做多次上下文切换,每次切换需要耗费 5~10us 左右的时延,另外还需要至少三次的数据拷贝和依赖 CPU 进行协议封装,这导致仅仅协议栈处理就带来数十微秒的固定时延,使得在 AI 数据运算和 SSD 分布式存储等微秒级系统中,协议栈时延成为最明显的瓶颈。

  • 二、TCP 协议栈处理导致服务器 CPU 负载居高不下

除了固定时延较长问题,TCP/IP 网络需要主机 CPU 多次参与协议栈内存拷贝。
网络规模越大,网络带宽越高,CPU 在收发数据时的调度负担越大,导致 CPU 持续高负载。按照业界测算数据:每传输 1bit 数据需要耗费 1Hz 的 CPU,那么当网络带宽达到 25G 以上(满载),对于绝大多数服务器来说,至少一半的 CPU
能力将不得不用来传输数据。

为了降低网络时延和 CPU 占用率,服务器端产生了RDMA功能。RDMA 是一种直接内存访问技术,他将数据直接从一台计算机的内存传输到另一台计算机,数据从一个系统快速移动到远程系统存储器中,无需双方操作系统的介入,不需要经过CPU耗时的处理,最终达到高带宽、低时延和低资源占用率的效果。

从这张图可以很清楚地看出使用TCP/IP与使用RDMA两者的区别。

我们需要记住两个关键词: 零拷贝(Zero-Copy)、内核旁路(Kernel Bypass)

这里暂不解释RDMA的通信原语/编程相关的问题。

RDMA是一种网络通信技术, 目前常见的有以下3种具体的实现:

  • iWarp: 由于其失去了最重要的 RDMA 的性能优势,已经逐渐被业界所抛弃
  • InfiniBand: 的性能最好,价格昂贵且运维难度大
  • RoCE: 可基于以太网模式,经济实用

这里主要介绍RoCE, RoCE也分为v1, v2两种版本,
v1工作在L2层, v2可以工作在L3, 网络使用范围更广, 这里以v2为主。

由此引出主角: RoCE v2.

参考文章: