UPD流控的原理
一、背景
对于国内一些P2P流媒体应用,通过控制上行流量的方法才能较好的控制住下行流量,通过对线路整体负载的监控,也能实现带宽空闲时允许P2P应用多使用带宽,关键业务启动线路带宽繁忙时让P2P应用退让带宽。现有方案的主要缺陷在于流控通过丢包控制下行流量,但是缺乏流控机制的应用不会因为我们的丢包而降低外网流量。
二、实现原理
(1)流控模型与PID算法
对于流控模型,认为到达设备的下行流量的产生源自于内网上行流量的请求,即Vdn(t) = F(Vup(t-t0)),这是一个理想模型,t0是延时。针对这一模型可以使用PID算法构成闭环控制系统:
原始PID算法公式:
第一个单项式是对误差e进行比例计算,用于匹配输入信号与输出信号之间存在的比例关系;第二个单项式是对误差e进行积分计算,用于消除历史累积误差;第三个单项式是微分计算,用于预测未来的变化趋势。
数字系统中需要使用离散量的PID算法,令t=kT,T为离散量采样周期,k为自然数,离散PID算法公 式:
实际应用中,离散式需要存储历史误差用于积分,且计算直接产生的u(kT)容易出现突变,造成系统严重抖动,因此使用增量式,每次计算u(kT)的增量即可,以T=1为周期,离散PID增量式:
缩放比例tuning=
,参数sensitive用于调节灵敏度,可以在误差e较大时提高sensitive,加快调节速度,误差e较小时降低sensitive,提高稳定性。
(2)通道缩放控制
对于基于令牌桶的HTB算法,通过扣除令牌数来限制发包速率,要缩放通道带宽只需要缩放扣除的令牌数即可,例如以前需要扣除tok个令牌,缩放后需要扣除的令牌数
(3)PID参数的自适应调整
PID算法应用的关键在于P、I、D三个参数的选取,在预研的过程中对60KB/s,200KB/s,400KB/s的线路进行了测试,发现(kp, kp, kd)=(50,20,5)是一组效果较好的经验值。
这三个参数的选取与被控制系统自身特性有关,不同的内网应用、不同的线路带宽可能有差异,通常PID算法应用可以使用遗传算法、粒子群算法等群体智能,但流控没办法搞大批量流控设备计算,最主要的还是不同的部署场景是有个体差异的,所以采用了一种类似于A*的搜索算法,在(p,i,d)三维空间搜索某个最佳点。
设定一个估值函数fitness,每个自适应周期对P、I、D三个参数之一进行加或减步长的操作,然后在周期结束后计算新的fitness,如果fitness减小了,说明适应效果好,于是沿着当前调节方向继续增或减步长的操作;如果fitness增大了,说明适应效果不好,于是回滚上一步操作,翻转调节方向并换一个参数继续调节。
fitness的设定需要描述期望的控制效果:误差最小,抖动最小。所以可以用误差的离散系数加上抖动的离散系数表示,离散系数是标准方差与平均值的比值,为了省去计算平均值的麻烦,可以取控制目标值。
(4)充分利用空闲带宽及向关键业务退让带宽
设定被控通道最小带宽为min_bw,最大带宽为max_bw(可接近线路带宽),按照线路实际流量root_chn动态调整被控通道带宽obj_bw,使线路实际流量在80%~90%的最大带宽间浮动:
当root_chn > 90%的线路带宽时,obj_bw= (obj_bw * 3 + min_bw) / 4; 当root_chn < 80%的线路带宽时,obj_bw= (obj_bw * 3 + max_bw) / 4;
三、实现效果
1 从200KB的线路带宽测试中发现,加入参数自适应的PID动态流控后,被控制的P2P通道的抖动在30%左右,当P2P通道与线路带宽以及其他通道的相对比重较小时,P2P抖动的影响也较小,流控效果好;当P2P通道占50%的线路带宽时,流控效果较差。
2 对于带宽避让,从400KB线路测试发现对p2p的动态流控可以在1分钟以内退让大部分带宽,2分钟以内完成退让。
3 如果多个通道内的流量没有关联,同时控制多个通道的效果和控制单个的效果相同,没有区别。
4 开启动态流控后,下行速率会在目标附近抖动,从测试情况看,抖动后的有效流量依然在100KB以上,所以内网视频体验不受影响。 |