这一篇论文是2019年sigcomm的论文,讨论了一种高精度拥塞控制算法HPCC(High Precision Congestion Control)。
设计背景
DCQCN是我们RDMA网络中的默认的流控机制。它利用ECN来发现拥塞风险并迅速做出反应。它还允许主机开始以线路速率进行积极的传输,并在短暂的拥塞后迅速提高它们的速率(FastRecover)。 关于DCQCN更具体的细节可以看看我的上一篇博客
然而在实践中,我们可以发现DCQ一直在配置中存在着两队矛盾:吞吐量vs 稳定性;带宽 vs 延时。论文在测试平台中进行了仿真,详细论述了这两对矛盾:
吞吐量vs 稳定性
在一个DCQCN配置中,很难在不影响网络稳定性的情况下实现高吞吐量。在图(a)我们可以看到,在30%的网络负载之下,更小的(Ti)和更大的(Td)通过让发送发更加积极地检测利用宽带,减少了每条流的平均完成时间。但是也正如图b所示显然这样做也会造成更多了PFC PAUSE帧的出现。
带宽 vs 延时
为了始终保持较低的延迟,网络需要在缓冲区中稳定地维持较小的队列(这意味着ECN标记阈值较低),而如果ECN标记阈值较低,则发送方将过于保守以至于无法提高流量。
HPCC模型
这里对论文提出的模型进行介绍。HPCC是一种用于大型高速网络的新型流控机制,它主要致力于实现以下三个目标:
- 超低延迟
- 高带宽
- 高稳定性
HPCC利用网络内遥测技术(INT)来获取精确的链路负载信息,并精确地控制流量。通过处理INT信息,HPCC可以快速利用空闲带宽,同时避免拥塞,并可以保持接近于零的网络内队列,实现超低延迟。
总体模型介绍
如图所示,发送方发送的每个数据包将由接收方确认。在从发送器到接收器的数据包传播过程中,沿路径的每个交换机利用其INT功能来插入一些数据,这些数据报告了包括时间戳(ts),队列长度(qLen),发送字节数(tx字节)和链路带宽容量(B)的信息。当接收方获取数据包时,它会将记录的所有元数据复制到ACK消息中发送回发送方。每次收到带有网络负载信息的ACK时,发送方决定如何调整其流速。
模型设计
调整流速的具体过程在这里进行介绍:
首先要知道,飞行包的大小直接对应了整个链路利用率。当飞行包的大小小于带宽乘RTT,也就是带宽延时积(BDP)的时候,说明信息量不能填满这样的“管道”,则链路未被充分利用,即还没有发生拥塞。
- I < B × T I < B × T I<B×T
同理当当飞行包的大小大于带宽乘RTT的时候,总吞吐量将超过链路带宽,发生拥塞。
- I > = B × T I >= B × T I>=B×T
所以,论文使用总的飞行包的大小来检测是否发生拥塞,并且目标是控制 I 略小于B * T。飞行包大小由队列和管道中的数据包组成,有公式:
-
t
o
t
a
l
i
n
f
l
i
g
h
t
b
y
t
e
s
=
q
l
e
n
+
t
x
R
a
t
e
×
T
total\ in\ flight\ bytes = qlen + txRate × T
total in flight bytes=qlen+txRate×T
这里设计一个参数 η η η,它是一个非常接近1的数,一般把它取值为95%。对于每一个链接 j j j,发送方都会通过参数 K j K_{j} Kj 来对发送窗口进行调整:
- K j = I j η ∗ B j ∗ T = U j η K_{j}=\frac{I_{j}}{η * B_{j} * T}=\frac{U_{j}}{η } Kj=η∗Bj∗TIj=ηUj
对 U j U_{j} Uj 进一步进行讨论,有:
- U j = I j B j ∗ T = q l e n + t x R a t e ∗ T B j ∗ T = q l e n B j ∗ T + t x R a t e B j U_{j}=\frac{I_{j}}{B_{j} * T}=\frac{qlen + txRate * T}{B_{j} * T } =\frac{qlen}{B_{j} * T} +\frac{txRate }{B_{j} } Uj=Bj∗TIj=Bj∗Tqlen+txRate∗T=Bj∗Tqlen+BjtxRate
然后再通过公式:
- W i = W i m a x j ( K j ) + W A I = W i m a x j ( U j ) / η + W A I W_{i}=\frac{W_{i}}{max_{j}(K_{j})}+W_{AI} =\frac{W_{i}}{max_{j}(U_{j})/η}+W_{AI} Wi=maxj(Kj)Wi+WAI=maxj(Uj)/ηWi+WAI
最终达到调整发送窗口 W W W,使得 I I I略小于 B ∗ T B * T B∗T的最终目的。这里的 W A I W_{AI} WAI是一个为了确定公平性而存在的一个很小的值。 W A I W_{AI} WAI越大,总的吞吐量越大,这个公平性也会越好。但是整体队列长度也会增加。
设计难点
延迟反馈容忍
延迟反馈容忍问题是说由于阻塞的出现导致携带阻塞标记的报文无法及时到达发送端,从而让整个反馈过程没有办法及时进行。具体情况如下图所示:
论文中使用窗口
(
W
)
(W)
(W)解决了这个问题,让一次发送的报文限制在一个范围,也就是窗口范围之内,这样的话不管是否发生拥塞反馈都可以及时进行。具体情况如下图所示:
过度反应
第二个问题就是过度反应的问题。如果HPCC针对每一个报文都去改变一次窗口大小,那在一个RTT之中的窗口会不断的振荡,会让传输的状态变得不够稳定。基于此,论文引入了窗口 W c i W_{ci} Wci,以每一个RTT为基础更新窗口状态。只有当接收到 W c i W_{ci} Wci发送到第一个数组包的ACK的时候,发送方才会以 W c i = W i W_{ci} = W_{i} Wci=Wi来进行更新窗口。具体公式更新如下:
- W i = W i c m a x j ( K j ) + W A I W_{i}=\frac{W_{i}^{c}}{max_{j}(K_{j})}+W_{AI} Wi=maxj(Kj)Wic+WAI
总结
相较于DCQCN,HPCC的效率已经高很多了。但是不太能理解为什么降速的时候可以直接降低到目标速率而在加速的时候采用了分段式增加速度的策略,明显这么做会降低效率,而且我也不认为直接提高速率会带来什么不好的影响或者是有非常难以实现的地方(应该是有的不然不用多此一举)。
我才发现MarkDown编辑器编辑公式是直接套用的Latex公式编辑器…真是用起来才发现已经忘得差不多了…