> 文章列表 > DCQCN学习

DCQCN学习

DCQCN学习

主要思想

与TCP的CC不同,RDMA中一般没有发送窗口这一概念,RDMA的CC主要是基于rate的CC
DCQCN就是一种基于rate的CC,并主要由ECN机制实现

初始设置sending rate为max line rate

接下来CC主要分为三个部分

CP(Congestion Point) 交换机

出端口当前queue length超过阈值K,则给packet打上ECN标记

NP(Notification Point) 接收端

对于每一个flow设置一个计时器,如果当前flow收到ECN标记且前 N μ s N \\mu s Nμs内都未收到ECN,则返回一个CNP报文给发送端,且重置计时器

RP(Reaction Point) 发送端

收到CNP报文则执行以下操作:
R T = R C , R C = R C ( 1 − α / 2 ) , α = ( 1 − g ) α + g , R_T=R_C, \\newline R_C=R_C(1-\\alpha/2), \\newline \\alpha=(1-g)\\alpha+g, RT=RC,RC=RC(1α/2),α=(1g)α+g,
其中, R T R_T RT为旧的sending rate, R C R_C RC为现在的sending rate, α \\alpha α为拥塞程度, g g g为设定的更新常数

此外,RP处也设有一个定时器,如果发现连续 K K K时间内均未收到CNP报文,则
α = ( 1 − g ) α , \\alpha=(1-g)\\alpha, α=(1g)α,
DCQCN没有使用Slow Start算法恢复sending rate,它同QCN类似,定义了两个计数器, T T T B C BC BC,每经过 T T T单位时间,计数器 T = T + 1 T=T+1 T=T+1,每转发 B B B字节,计数器 B C = B C + 1 BC=BC+1 BC=BC+1

M a x ( T , B C ) < 5 Max(T,BC)<5 Max(T,BC)<5时,启用Fast Recovery,每经过一个周期:
R C = ( R T + R C ) / 2 , R_C=(R_T+R_C)/2, RC=(RT+RC)/2,
否则当 M i n ( T , B C ) ≤ 5 Min(T,BC)\\le5 Min(T,BC)5时,启用Additive Increase,每经过一个周期:
R T = R T + R A I , R C = ( R T + R C ) / 2 , R_T=R_T+R_{AI}, \\newline R_C=(R_T+R_C)/2, RT=RT+RAI,RC=(RT+RC)/2,
这里的 R A I R_{AI} RAI是一个常数

否则,启用Hyper Increase,每经过一个周期:
R T = R T + R H I ⋅ ( m i n ( T , B C ) − 4 ) R C = ( R T + R C ) / 2 R_T=R_T+R_{HI}\\cdot (min(T,BC)-4) \\newline R_C=(R_T+R_C)/2 RT=RT+RHI(min(T,BC)4)RC=(RT+RC)/2
Additive Increase,这里的 R H I R_{HI} RHI也是一个常数

Buffer设置

对于buffer的设置应遵循两个原则:

1.PFC触发不能过早,保证ECN在其之前触发即可

2.PFC触发不能过晚,要保证网络无丢包

t f l i g h t t_{flight} tflight表示启用PFC后到PFC完全作用后这一段时间内进入buffer的数据量

t P F C t_{PFC} tPFC表示触发PFC的队列长度阈值,假设交换机有 n n n个出端口, B B B为总buffer大小, s s s为已占用buffer大小,则有:
t P F C ≤ ( B − 8 n t f l i g h t − s ) / 8 n , t_{PFC}\\le (B-8nt_{flight}-s)/8n, tPFC(B8ntflights)/8n
但实际情境下当Buffer仍有较多空余,随着出端口不断转发,我们不需要过早地触发PFC,所以:
t P F C ≤ β ( B − 8 n t f l i g h t − s ) / 8 , t_{PFC}\\le \\beta(B-8nt_{flight}-s)/8, tPFCβ(B8ntflights)/8,
t E C N t_{ECN} tECN表示触发ECN的队列长度阈值,显然 s ≤ n t E C N s\\le nt_{ECN} sntECN

又由于PFC要在ECN之后触发,所以:
t P F C ≥ n t E C N t_{PFC}\\ge nt_{ECN} tPFCntECN
最终可以得到:
t E C N < β ( B − 8 n t f l i g h t ) / ( 8 n ( β + 1 ) ) t_{ECN}<\\beta(B-8nt_{flight})/(8n(\\beta+1)) tECN<β(B8ntflight)/(8n(β+1))

一些特点

CNP generation

一段时间内只会发送一个CNP,并且与RTT无关,所以对反向链路拥塞不敏感

Rate based congestion control

基于rate的CC比基于窗口的CC更加细粒度且更容易实现

The need for PFC

由于一开始以满速率发送,所以不使用PFC仍会造成大量丢包,故DCQCN须与PFC搭配使用