我曾在Spirent公司工作,这是一家测试测量公司,专门开发高性能网络测试系统。我们的产品名为Test Center,当时我们与一支才华横溢的团队一起开发用于测试RoCEv2系统的系统。我的工作重点是优先级流控制(PFC),以及如何将其应用于基于800Gbps FPGA的“数据包分析器和生成器”(也称为PGA)。

然而,我从未真正了解过第 4 层,这份备忘录试图通过阐述 InfiniBand 传输层 (L4) 的关键要素并用一些图表将其可视化来弥合这一差距。

RoCEv2框架 链接到标题

让我们从实际的 RoCEv2 帧开始:

RoCEv2 帧

基本传输头 (BTH) 链接到标题

BTH 标头中包含的关键字段:

  • 操作码:用于指定 RDMA 操作的类型,例如 RDMA_WRITE、RDMA_READ 等。

  • 目标队列对:用于区分数据包的不同目标队列对。

  • 确认请求:指示接收端是否需要对此数据包返回 ACK。

  • 数据包序列号 (PSN):用于数据包序列跟踪,以确保可靠交付。

由于UDP协议不可靠,帧可能会丢失、乱序或重复,因此使用PSN来确保帧的正确传输。然而,这也意味着IBTL需要有一种方法来请求帧重传。这可以通过AETH头部来实现,具体内容将在下文描述。

扩展传输头 (ETH) 链接到标题

InfiniBand传输层包含多个扩展头部,用于特定功能。对于RDMA而言,最值得关注的两个扩展头部是RETH和AETH。

RDMA 扩展传输头 (RETH) 链接到标题

RDMA_WRITE 操作需要多个元素,这些元素在 RETH 扩展报头的各个字段中表示。该报头会将写入操作的详细信息告知接收硬件,包括:

  • 虚拟地址:数据将写入的目标内存地址

  • 远程密钥 (R_Key):用于验证内存区域权限的访问密钥

  • 长度:要传输的数据的大小

ACK 扩展传输标头 (AETH) 链接到标题

如前所述,IBTL 需要在传输不可靠时通知发送方。这是通过 EATH 扩展实现的,该扩展包含以下字段:

  • 综合征:包含响应代码的字段,这些响应代码指示成功 (ACK)、错误情况 (NAK) 或接收器未就绪 (RNR) 状态,以及流控制信息。

  • 消息序列号 (MSN):表示最近完成接收的消息的序列号,这意味着所有序列号低于此值的消息都已成功接收。

自定义扩展 链接到标题

IBTL 规范(参见第 9 章)确实包含相当多的扩展,其中一些引起了我的注意:

  • 比较和交换:可以实现无锁同步。

  • 发送与写入:前者可用于控制流,后者可用于数据流。

  • 立即扩展:允许在传输内存的同时交换侧信道元数据。

我也一直在思考如何知道标头中包含哪些扩展名。答案很简单:对于每个操作码,都有一个待解析的扩展名列表——该列表是静态定义的,是规范的一部分。

大象流挑战 链接到标题

正如 Toni Pasanen 在其博客 The Network Times 中所述:

GPU 之间的通信会产生海量的数据流,支持 RDMA 的网卡会以线速传输这些数据流。这些数据流很容易导致后端网络拥塞。

RDMA 能够以线速生成流量,这令人惊叹。但这同时也带来了一个问题,即流单元大小(两个连续非活动时间段之间的流量大小)会受到影响,在使用 RDMA 大流量时,访问“非活动间隙”的概率会显著降低。

Flowlet Size - RDMA vs TCP 图片来自:支持网络内重排序的 RDMA 网络负载均衡

负载均衡挑战 链接到标题

另一个复杂之处在于脊叶拓扑结构的负载均衡,当使用“数据包喷射”负载均衡时,单个队列对上的数据包可能会乱序接收。这造成了一定的复杂性,而英伟达通过引入一种名为“RDMA 只写”的新型 RDMA 操作解决了这个问题。

数据包喷射:操作码:TDMA 仅写 原图来自:网络时报

# 结论

这是一份“动态”备忘录,我会随着找到更多关于 IBTL 的信息而不断更新。

目前还没有定论,但可以肯定的是,RDMA 是一种非常优雅的解决网络效率挑战的方法,同时也带来了一系列新的挑战。


References: