原文在这里,是一篇2018年的NSDI。
Vivace的对手
PCC Vivace结合了一篇2015年NSDI的PCC[1]的基本框架,以及机器学习中online convex optimization的原理[2],通过调整发送端速率的调整方向、调整步长和调整阈值,来解决网络的拥塞控制问题。
这篇论文作为拥塞控制问题的解决办法之一,在Introduction段就击中了上一篇文章讲到的Remy[3]的痛点——无法自适应不同的网络应用场景。
论文也将BBR[4]作为主要的对比对象之一。BBR采用白盒的网络建模方式,假设网络环境已知;而PCC Vivace使用黑盒方法,感知网络在给出某发送速率之后的表现,从而调整发送速率。Dong实验发现,一方面,在网络达到稳定收敛的状态后,BBR仍表现出较大的比特率抖动和较高的丢包率。另一方面,和Remy一样,一旦建模的网络环境和真实的网络环境相差很大,算法的性能就会遭受严重的损失。
另外,论文特别提到了另一个对比对象,Sprout[5]。Sprout是一篇2013年的NSDI,使用随机森林的方法达到蜂窝网络下的高吞吐量和低延迟。Dong承认在蜂窝网络的场景下Sprout比Vivace表现更好,但表示Vivace的目标是一种更普适的拥塞控制算法,不会局限于某一种特定的网络场景。
Vivace的效用方程
Vivace将时间切割成连续的 MI (Monitor Intervals)。每个MI结束时,发送端i就用下面的效用方程把MI时段观察的数据转换为效用值 u:
其中0<t<1,b>=0,c>0,xi是发送端 i 的发送速率,Li 是所观察到的丢包率,式子的第二项是这段 MI 所观察到的 “RTT梯度” 。总体来说,效用值在吞吐量上升时得到奖励,在RTT和loss上升时受到惩罚。
Vivace的四个Theorem
Theorem1
Theorem1: 考虑一个网络模型中,有n个同构sender同时竞争一个带FIFO队列缓冲的瓶颈链路,网络收敛时,每个sender发送速率都相等
Theorem2
理想情况下,网络收敛时,latency不会超过base RTT,i.e.,没有使用链路缓冲时的RTT。因此第二个theorem得出了达到这种理想情况对参数b的要求。
假设C为瓶颈链路的容量,当b满足下面的不等式时,网络稳定时delay不超过base RTT:
Theorem3
p-loss-resilient:这个协议不降低发送速率时,最多能忍受p的随机loss(一旦随机loss超过p就要求降低发送速率)
要使Vivace能承受p-loss-resilient,则需要设置效用方程的第三项中的参数c满足:
然而要忍受更多的随机loss是有代价的。为了简化,下面设置b=0(即效用方程的计算只依赖loss)。
在一个有n个Vivace sender的系统中,每个sender要达到p-loss-resilient,则处于平衡状态的每个sender i 的丢包率L满足:
Theorem4
上面的三条theorem都是讨论的同构的sender,这一条是关于异构sender的情况。异构senders通常需要考虑的就是资源分配的问题。举一个详细的例子,效用公式如下:
假定n个Vivace senders共用链路容量为C的瓶颈链路,各个sender被分配的资源总和为C。
若每个sender的损失惩罚系数c设置如下,则链路最终收敛到各sender被分配的资源总和为C。
Vivace的比特率控制算法
(鉴于公式字符过于复杂,这里不详细列出每个字符了)
总的来说,每次计算新的发送比特率时,都会先给定一个小的差值,计算上次比特率加减差值的两个效用方程的值,两效用值相减再除以二倍差值就是比特率在此时的梯度(也就是导数)。Vivace算法通过控制这个梯度的值来控制比特率的变化程度。新的比特率=上一次比特率+梯度
首先,Vivace给这个梯度设置了一个信心放大器。顾名思义,比特率连续朝同一个方向改变的次数多了,那步子就可以迈大一点,即增加梯度。
其次,Vivace给步长设置了一个动态阈值(毕竟步子迈大了容易***),一旦这次计算的梯度超出了此时的阈值,那就把阈值拉高一点点;一旦没超过,但比特率仍朝着同一个方向前进,那就把阈值拉回比这次计算的梯度多一点点的地方等它下次争取超过;一旦比特率连变化方向都变了,那直接把阈值设为0,哪怕你之前腿比维密模还长都得全砍了。
总结
Vivace的大体思路如上,但论文中分loss和delay进行了实现和对比,实验细节详见论文本文。