文章目录
- Introduction
- DCQCN
- Buffer Setting
Introduction
PFC是粗粒度的流量控制机制,在端口层面发挥作用,不区别不同的流。这会导致很多弊端,比如不公平,受害流等。
解决PFC限制的解决方法是flow-level的拥塞控制,DCQCN就是一种RoCEv2上的end-to-end的拥塞控制协议。
DCQCN
DCQCN包括sender(reaction point, RP),switch(congestion point, CP),receiver(notification point,NP)。
CP算法:在switch上,使用以下的概率函数对数据包进行ECN标记。
NP算法:ECN标记的包到达NP(receiver),表示网络中出现了拥塞。NP发送CNP(Congestion Notification Packets)包,将这个信息传达给sender。对于一个流,如果一个标记的包到达,并且在之前的N微秒内没有CNP被发送,CNP就立即被发送。也就是说,对于每个流, 每N微秒最多发送1个CNP包。作者将N设置为 50 μ s 50\mu s 50μs。
RP算法:当一个RP(sender)收到一个CNP时,它减少它的当前发送速率( R C R_C RC)并且更新速率降低因子( α \alpha α),最后记录当前的速率为之后恢复过程的目标速率( R T R_T RT)。
当RP每K个时间单元没收到反馈时,它就更新 α \alpha α。注意K必须比CNP产生间隔要大。作者将K设置为 55 μ s 55\mu s 55μs。
α = ( 1 − g ) α \alpha = (1-g)\alpha α=(1−g)α
而且,RP使用计时器和字节计数器增加发送速率。字节计数器每B字节增加一次速率,计时器每T个时间单元增加一次速率。计时器确保流能够快速恢复,即使在它的速率降到一个很低的值时。速率恢复包括两个主要的阶段,第一个阶段是fast recovery,执行如下的F=5轮迭代,以快速接近目标速率 R T R_T RT:
R C = ( R T + R C ) / 2 R_C = (R_T + R_C) / 2 RC=(RT+RC)/2
fast recovery后面跟着additive increase,目标速率每次增加 R A I R_{AI} RAI,当前速率缓慢地靠近目标速率:
状态机如下:
Buffer Setting
DCQCN需要平衡两个冲突的请求:
- PFC不能触发得太早(不能在ECN发送拥塞反馈之前触发)
- PFC不能触发得太晚(导致buffer overflow,造成包丢失)
Headroom buffer t f l i g h t t_{flight} tflight:发送到上游设备的PAUSE消息需要一段时间来到达和发挥作用。为了避免包丢失,PAUSE发送者需要保留足够的buffer空间,以处理这段时间内接收的包。这包括PAUSE被发送时in flight的包,以及上游设备处理PAUSE时发送的包。作者将每个端口,每个优先级的 t f l i g h t t_{flight} tflight设为22.4KB。
PFC Threshold t P F C t_{PFC} tPFC:这是一个进入队列在PAUSE发送到上游设备之前,能够增长到的最大大小。在每个进入端口,每个PFC优先级都有它自己的队列。因此,如果switch buffer的总大小为B,有n个端口,需要遵守 t P F C ≤ ( B − 8 n t f l i g h t ) / ( 8 n ) t_{PFC} \leq (B - 8nt_{flight})/(8n) tPFC≤(B−8ntflight)/(8n)。当队列降低到 t P F C t_{PFC} tPFC以下两个MTU时,交换机发送RESUME消息。
ECN Threshold t E C N t_{ECN} tECN:一旦外出队列超过这个阈值,交换机开始标记数据包(即上图中 K m i n K_{min} Kmin)。为了使DCQCN有效,此阈值必须足够低,以使PFC阈值在交换机有机会用ECN标记数据包之前不会被触及。 t E C N t_{ECN} tECN是外出队列阈值, t P F C t_{PFC} tPFC是进入队列阈值。
在此基础想法上,作者设置了阈值的大小。
除此之外,作者在各种参数上进行了测试,从而选出最佳的参数大小。