实战用丢包实现流控

                        

1.基本思路:

虚拟专用网用周期性丢包(每N个丢一个)触发后台服务器周期性流控,经过一段时间流量会趋于一个稳定值。以上一秒的流量以及一个较长周期的流量作为因子调整丢包率。运用强化学习的策略,当流量在阈值之外时进行惩罚(调整丢包率),当流量在阈值之内时进行奖励(不改变丢包率,甚至容忍之后的小范围波动)应用这种策略,我测试的case最后都可以收敛到阈值80%-130%这个范围内。

 

2.关于强化学习(增强学习)

因为决定带宽的因素错综复杂,很难建立一个数学模型来决定丢包率。增强学习是试错学习(Trail-and-error),由于没有直接的指导信息,智能体要以不断与环境进行交互,通过试错的方式来获得最佳策略,这种方法适合QOS的开发。

3.丢包算法

 

1)当限速比(原始速率/目标速率)较低时

以丢包率N(每隔N秒丢一个)大于等于10为标准。此时相邻两个丢包率的差别较小,比如10和11,每110个包前者才多丢一个。当限速比较低(比如20M到5M)时,可以以10以上的丢包率收敛到阈值。

 

(1)超过阈值:

N = 上一秒的丢包率 /(1 + 0.2 * (上一秒流量/阈值) + 0.05 * (长期流量调节因子))

 

(2)低于阈值:

N = 上一秒的丢包率 *(1.8 + 0.05 * (长期流量调节因子))

 

长期流量调节因子是一个较长周期内流量超出或者低于阈值的程度,比如长期流量过大时可自动做如下调整:

(1)在流量超标时更快地增大丢包率,

(2)在流量低于阈值时更快地减少丢包率

 

这个参数在一定程度上可以修正丢包算法里写死的参数.同时这个参数使算法加入了一定的随机性,可以在一定程度上避免计算出的丢包率在一个误差较大区间停留太长时间。

 

2)当限速比较高时用插值算法

 

比如从20M限速到1M,丢包率是3时速率远小于1M,丢包率是4时速率远大于1M,无法达到预期的阈值。最优值在3和4之间,比如3.4,但是%运算无法计算非整数。

近似的方法是用插值算法,在一个较长的周期里实现更高的丢包精度。以当前丢包率为3,最大插值20为例:

 

  1. 开始的时候丢包率为3,此时带宽小于1M,这时需要进行丢包率4的插值。

每3个丢1个先丢20个包,然后插入一次4丢1,这时丢包率为3.05。

 

  1. 如果带宽还小于阈值,每3个丢一个先丢19次,然后插入一次4丢1,以此类推增加丢包率4的插值。如果在阈值之内,则停止。如果大于阈值,则进行反向插值进行回溯。
  2. 当达到每3个丢1个和每4个丢一个交替进行,这时丢包率为3.5。

每3个丢1个和每4个丢一个交替进行,这样丢包率为3.5,如下(1代表发包,0代表丢包)所示:

111011110111011110

进行一轮后相当于搜索了3.0-3.5这个范围,

  1. 如果次轮插值完成后没有收敛并且贷款小于阈值,丢包率变成4。如果丢包率4的流量大于阈值,那么进行在其中进行丢包率3的插值,即在4-3.5之间搜索。如果流量小于阈值,进行丢包率5的插值,即在4.0-4.5之间搜索。

 

这种丢包方式能以更小的步长来查找最优解,丢包率的变化较为平稳,有利于避免流量大幅波动。其代码实现也非常简单。

实际测试中把插值个数设成20可以在大多数情况可以收敛,有很少的情况会在两个步长之间震动,但平均流量在阈值误差30%之内。

这个插值方法并不是线性插值,在开始的时候步长较小,然后逐渐加大步长,这样有利于稳定流量,增大收敛的概率。

 

4.泛化能力

强化学习的泛化能力较强,同时尽量提高算法的泛化能力,在编码中尽量遵循下面原则:

(1)简化算法,用最少的数量的因子。减少条件判断,尽量用普适性强的判断条件。尽量不用写死的值。

(2)避免陷在一个不理想的区间无法跳出。

 

5.收敛速度的提高

(1)根据不同的限速比赋予不同的初值。

(2)在一定条件下进行二分查找来减少搜索时间。

 

6.可调整的参数:

(1)阈值可容忍波动范围:目前默认设为0.8-1.3,扩大这个范围可以增加收敛速度,减少可以增加精度,收敛速度可能会变慢。

(2)插值算法每轮最大插值个数:默认20,如果调得更小可以增加精度,增加收敛的概率,但同时会增加收敛过程的时间。

(3)达到目标阈值后容忍的连续偏离次数:默认3.如果调得更小可以增加精度,但收敛过程可能会更慢。

 

7. 限速能力

目前丢包率最高50%,可以把原始带宽23M的http下载速度降到最低20K。这个幅度在实际应用中应该能满足需求。

如果需要限速到更低可以调节最大丢包率到100%,这时算法会在100%和50%之间插值来逼近小于20K的带宽。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章