全网最全的RDMA拥塞控制入门基础教程-优快云博客
【RDMA】3. RDMA基本元素和编程基础_rdma的rq中有什么信息-优快云博客
三种队列
RDMA一共支持三种队列,发送队列(SQ)、接收队列(RQ)、完成队列(CQ)。
其中,SQ和RQ通常成对创建,被称为Queue Pairs(QP)。
RDMA是基于消息的传输协议,数据传输都是异步操作。 RDMA操作其实很简单,可以理解为:
- Host提交工作请求(WR)到工作队列(WQ): 工作队列包括发送队列(SQ)和接收队列(RQ)。工作队列的每一个元素叫做WQE, 也就是WR。
- Host从完成队列(CQ)中获取工作完成(WC): 完成队列里的每一个叫做CQE, 也就是WC。
- 具有RDMA引擎的硬件(hardware)就是一个队列元素处理器。 RDMA硬件不断地从工作队列(WQ)中去取工作请求(WR)来执行,执行完了就给完成队列(CQ)中放置工作完成(WC)。
从生产者-消费者的角度理解就是:
- Host生产WR, 把WR放到WQ中去
- RDMA硬件消费WR
- RDMA硬件生产WC, 把WC放到CQ中去
- Host消费WC
RDMA硬件不断地从工作队列(WQ)中去取工作请求(WR)来执行,执行完了就给完成队列(CQ)中放置工作完成通知(WC)。这个WC意思就是Work Completion。表示这个WR RDMA请求已经被处理完成,可以从这个Completion Queue从取出来,表示这个RDMA请求已经被处理完毕。
RDMA通信基于三条队列(SQ, RQ和CQ)组成的集合。 其中,发送队列(SQ)和接收队列(RQ)负责调度工作,他们总是成对被创建,称之为队列对(QP)。当放置在工作队列上的指令被完成的时候,完成队列(CQ)用来发送通知。
当用户把指令放置到工作队列的时候,就意味着告诉HCA那些缓冲区需要被发送或者用来接受数据。这些指令是一些小的结构体,称之为工作请求(WR)或者工作队列元素(WQE)。 WQE的发音为"WOOKIE",就像星球大战里的猛兽。
HCA:在Infiniband/RoCE规范中,将RDMA网卡称为HCA,全称为Host Channel Adapter(主机)通道适配器 (HCA)
一个WQE主要包含一个指向某个缓冲区的指针。一个放置在发送队列(SQ)里的WQE中包含一个指向待发送的消息的指针。一个放置在接受队列里的WQE里的指针指向一段缓冲区,该缓冲区用来存放待接受的消息。
RDMA是一种异步传输机制。因此我们可以一次性在工作队列里放置好多个发送或接收WQE。HCA将尽可能快地按顺序处理这些WQE。当一个WQE被处理了,那么数据就被搬运了。 一旦传输完成,HCA就创建一个完成队列元素(CQE)并放置到完成队列(CQ)中去。 相应地,CQE的发音为"COOKIE"。
RDMA收发过程
First Step
系统A和B都创建了他们各自的QP的完成队列(CQ), 并为即将进行的RDMA传输注册了相应的内存区域(MR)。 系统A识别了一段缓冲区,该缓冲区的数据将被搬运到系统B上。系统B分配了一段空的缓冲区,用来存放来自系统A发送的数据。
Second Step
系统B创建一个WQE并放置到它的接收队列(RQ)中。这个WQE包含了一个指针,该指针指向的内存缓冲区用来存放接收到的数据。系统A也创建一个WQE并放置到它的发送队列(SQ)中去,该WQE中的指针执行一段内存缓冲区,该缓冲区的数据将要被传送。
Third Step
系统A上的HCA总是在硬件上干活,看看发送队列里有没有WQE。HCA将消费掉来自系统A的WQE, 然后将内存区域里的数据变成数据流发送给系统B。当数据流开始到达系统B的时候,系统B上的HCA就消费来自系统B的WQE,然后将数据放到该放的缓冲区上去。在高速通道上传输的数据流完全绕过了操作系统内核。
Forth Step
当数据搬运完成的时候,HCA会创建一个CQE。 这个CQE被放置到完成队列(CQ)中,表明数据传输已经完成。HCA每消费掉一个WQE, 都会生成一个CQE。因此,在系统A的完成队列中放置一个CQE,意味着对应的WQE的发送操作已经完成。同理,在系统B的完成队列中也会放置一个CQE,表明对应的WQE的接收操作已经完成。如果发生错误,HCA依然会创建一个CQE。在CQE中,包含了一个用来记录传输状态的字段。
我们刚刚举例说明的是一个RDMA Send操作。在IB或RoCE中,传送一个小缓冲区里的数据耗费的总时间大约在1.3µs。通过同时创建很多WQE, 就能在1秒内传输存放在数百万个缓冲区里的数据。
ECN
[RoCE]拥塞控制机制(ECN, DC-QCN) - blackwall - 博客园
ECN(Explicit Congestion Notification)是 IP 头部 Differentiated Services 字段的后两位,用于指示是否发生了拥塞。它的四种取值的含义如下:
代码 | 状态 | 解释 |
---|---|---|
00 | None ECN-Capable Transport | 表示发送方不支持ECN |
01 | ECN Capable Transport | 表示发送方支持ECN |
10 | ECN Capable Transport | 表示发送方支持ECN |
11 | Conjestion Encountered | 表示发生了拥塞 |
部署 ECN 功能一般需要交换机同时开启 RED。如果通信双方都支持 ECN(ECN 为 01 或者 10),当拥塞出现时,交换机会更新报文的 ECN 为 11(Congestion Encountered),再转发给下一跳。接收方可以根据 ECN 标志向发送方汇报拥塞情况,调节发送速率。
RED,即 Random Early Drop,是交换机处理拥塞的一种手段。交换机监控当前的队列深度,当队列接近满了,会开始随机地丢掉一些包。丢弃包的概率与当前队列深度正相关。随机丢弃带来的好处是,对于不同的流显得更公平,发送的包越多,那么被丢弃的概率也越大。
当 RED 和 ECN 同时开启,拥塞发生时交换机不再随机丢包,而是随机为报文设置 ECN。
ECN原理
ECN拥塞标记概率是队列长度的概率函数,如下图所示。队列长度的两个门限值定义了标记概率。当队列长度低于门限值下限时,ECN位不会被标记。当队列长度超过门限值上限时,所有从该队列传输的网络包都会被进行ECN标记。当队列长度处于两个门限值之间时,数据包会以与队列长度线性增长的概率被进行ECN标记。
带有ECN标记的数据包(CE)被传播到接收方的网卡上。接收方网卡创建一个CNP并把它发送给ECN所标记的数据包的发送方。CNP数据包包括被标记的QP的信息。当CNP被发送方网卡收到时,它会基于一个特定的算法来降低指定QP的传输速率。
DCTCP
DCTCP(Data Center TCP),扩展TCP的拥塞控制算法,在交换机中使用显式拥塞通知(ECN)来检测并响应网络拥塞。
DCTCP的一些特点
- 拥塞检测:DCTCP使用一种称为ECN(显式拥塞通知)的机制来检测网络中的拥塞。当网络设备(如交换机)检测到拥塞时,它可以向发送方发送ECN标记,告知发送方网络出现拥塞。这比传统TCP的拥塞检测要更快,因为它不需要等待丢包。
- ECN标记反馈:当DCTCP接收到ECN标记,它会以更低的速率发送数据,以减轻网络拥塞。这种反馈机制使得DCTCP可以更快地适应拥塞情况,减少了数据中心网络中的拥塞峰值。
- 拥塞窗口调整:DCTCP使用了一种称为“拥塞响应函数”的算法来计算发送端的拥塞窗口大小。它根据检测到的ECN标志的数量来调整拥塞窗口的大小。当ECN标志出现时,拥塞窗口减小,以减缓数据流量,减轻网络拥塞。这使得DCTCP能够更快速地响应拥塞信号,而不必等待数据包丢失,这是传统TCP拥塞控制的问题之一。
- 部署要求:要部署DCTCP,需要支持ECN的网络设备,以及运行DCTCP协议栈的主机。此外,需要适当配置和调整DCTCP的参数,以便最大化其性能。
PFC
RoCEv1和v2是基于ifinite band的解决方案,数据在ifinite band交换时需要无损lossless,因此RoCE也需要交换机支持lossless。但其中RoCEv1不需要PFC(Priority Flow Control),而RoCEv2需要。因为RoCEv1只支持链路层转发,只考虑同一交换机两个端口之间转发的情况,由于ifinite band交换机本身支持无损网络,因此不需要PFC。但RoCEv2支持第三层IP路由,要考虑跨交换机转发数据,一旦跨交换机就没法保证无损了,因此需要PFC功能保证无损。也就是说PFC保证链路lossless,让RDMA能在三层下正常运行。
让RDMA仅仅运行起来是不够的,实际环境下网络中基本的拥塞问题仍需解决。RoCEv2使用了DCQCN作为拥塞控制算法,算法使用的拥塞反馈信号主要是ECN(Explicit Congestion Notification)。因此使用ECN目的是解决网络拥塞,提高RDMA的传输性能。
RoCE是一个允许在以太网上执行RDMA的网络协议,可分为RoCE v1和RoCE v2,其中RoCE v2使用了PFC技术和ECN技术,使用的拥塞控制算法是DCQCN。
DCQCN
数据中心量化拥塞通知 (DCQCN) 是 ECN 和 PFC 的组合,可支持端到端无损以太网。ECN 有助于克服 PFC 的限制,实现无损以太网。DCQCN 背后的理念是允许 ECN 在拥塞时降低传输速率,从而尽量缩短触发 PFC 的时间,从而完全停止流量,从而控制流量。
DCQCN 正确操作需要平衡两个冲突要求:
- 确保 PFC 不会太早触发,也就是说,在让 ECN 有机会发送拥塞反馈之前,使流量变慢。
- 确保 PFC 未因太晚而触发,因此导致数据包丢失(由于缓冲区溢出)。
有三个重要参数需要正确计算和配置,才能满足上述关键要求:
- Headroom Buffers
发送至上游设备的 PAUSE 消息需要一些时间到达并生效。为避免丢包,PAUSE 发送方必须保留足够的缓冲区,以处理在此期间可能收到的任何数据包。这包括发送 PAUSE 时正在传输的数据包,以及上游设备在处理 PAUSE 消息时发送的数据包。 - PFC Threshold
这是一个入口阈值。这是在将 PAUSE 消息发送至上游设备之前入口优先级组可以增长为的最大大小。每个 PFC 优先级在每个入口端口都有自己的优先级组。在每个入口端口按优先级组设置 PFC 阈值。 - ECN Threshold
这是一个出口阈值。ECN 阈值等于 WRED 开始填充级别值。一旦出口队列超过此阈值,交换机将开始为该队列中的数据包进行 ECN 标记。DCQCN 要有效,此阈值必须低于入口 PFC 阈值,以确保 PFC 不会在交换机有机会使用 ECN 标记数据包之前触发。设置非常低的 WRED 填充级别可提高 ECN 标记概率。例如,使用默认共享缓冲区设置,WRED 开始填充级别为 10%可确保标记无丢失数据包。但是,如果填充级别较高,则 ECN 标记的概率降低。例如,如果两个入口端口流量无损地发到同一出口端口,并且 WRED 启动填充级别为 50%,则不会进行 ECN 标记,因为将首先满足入口 PFC 阈值。
DCQCN运行过程
发送方(RP)以最高速开始发送,沿途过程中如果有拥塞,会被标记ECN显示拥塞,当这个被标记的报文转发到接收方(NP)的时候,接收方(NP)会回应一个CNP报文,通知发送方(RP)。收到CNP报文的发送方(RP),就会开始降速。当发送方没有收到CNP报文时,就开始又提速了,上述过程就是DCQCN的基本思路。
拥塞点操作
当队列长度超过ECN标记阈值时,在数据包ECN位上标记,其概率与队列长度成比例。 这些标记的数据包是显示发生拥塞的信号。 PFC用于防止数据包丢失。当队列长度超过PFC阈值时,PFC数据包将发送到上游端口以阻止它们发送。
接收端操作
当流的接收端接收数据包时,它检查其ECN位。如果一个接收端接收到带有ECN标记的分组,则它向流的发送端发送拥塞通知分组CNP,并且在下一个固定的时间段内,例如50微秒,它将不再针对相同的流发送CNP。
CNP是拥塞信号,通知发送者控制流速。
发送端操作
当流量发送端接收到CNP时,它会按比例减少流量。当发送方未在固定时间内继续收到CNP时,它会根据其先前的状态增加流量。
DCQCN三种加速阶段
加速有三种阶段,如QCN,快速恢复,加性增加和超增加。
在快速恢复中,发送方将流速增加到上次切割前的速率。快速恢复将持续到,恢复到目标速率
在加性增长中,流速相加地增加,也就是说,使用固定的增加步骤。
在超级增长中,增加步骤随着增加的时间增长而增长。