用 PID 优化拥塞控制

这算是一篇读书实践,最近读了 B 站 up 主 DR_CAN 的《控制之美》,本想写篇读后感,有了 PID 和我的 inflight 守恒算法的结合,就算是习题和实践了。PS:这本书非常不错,但并非专业计算机范畴的作品,控制论大多数被应用在机械自动化,电子自动化,航空航天,机器人,运筹学等,但拥塞控制肯定也属于控制论范畴,这一点我早就提到过。

PID 是最简单易用的闭环控制方案,它的连续形式如下:

C ( t ) = K p e ( t ) + K i ∫ 0 t e ( r ) d r + K d d e ( t ) d t C(t)=K_pe(t)+K_i\displaystyle\int_0^te(r)dr+K_d\dfrac{de(t)}{dt} C(t)=Kpe(t)+Ki0te(r)dr+Kddtde(t)

第一项表示当前误差作用,第二项表示历史累积误差作用,第三项表示当前误差趋势而直指未来,三项之和覆盖整个时间轴。

调参方面,Kp 调节逼近速度,Ki 调节准确性,消除稳态误差,Kd 调节稳定性,减缓震荡,三者代表所谓快,准,稳。

端到端可靠传输协议作为典型的闭环反馈系统,看起来也能用 PID,以前曾思考过这问题,参见 TCP拥塞控制和PID控制器,然而网络传输并非线性系统,PID 相对不好使,但选对目标误差,让 PID 作用于该目标,而不是整个系统就很高尚。

以 tcp ack 时钟为例,我使用 PID 离散形式(微分项的 Δ t \Delta t Δt已经并入了 Kd):

C = K p e i + K i Σ j = 0 i e j + K d ( e i − e i − 1 ) C=K_pe_i+K_i\Sigma_{j=0}^ie_j+K_d(e_i-e_{i-1}) C=Kpei+KiΣj=0iej+Kd(eiei1)

现在准备将它作用于 E_best 共识。

我曾经用两项 inflight 逼近传输管道最佳效能:

  • 保持 inflight = b * minrtt + (minrtt / (srtt^gamma * bw)) * beta

两项和有闭环负反馈之意,但和 PID 相比还是复杂,用 PID 逼近 E_best 更高尚,做法如下:

  • E_previous = delivery_rate_previous / srtt_previous,用刚采样值滚动计算;
  • E_curr = delivery_rate / srtt,用一个 minrtt 后的采样值滚动计算;
  • Err = E_curr - E_previous 作为 PID 的 error 输入;
  • 以 PID 的输出 C 做 cwnd 调节依据 cwnd += Kr*C。

就这么多,超简单。高端食材只需要最简单的烹饪方法。这就是 PID 版本的 inflight 守恒算法,但这是基本版。

原始的 ccr 版本(仓场路版本,因为我在仓场路的一个公园亭子里写的代码)苦于无法和 cubic 等 aimd 算法共存,和 vegas 的毛病一样,在深 buffer 场景会无限吃亏,但 PID 版本可以解决这个问题,作为一个开关特性:

  • 定期 probe;

当开启时,每间隔 p_interval 个 srtt 就用 1.25X 的 inflight 进行 probe,若 E = bw / delay 增加则继续 probe,若 E 减少则回退 probe 的 inflight。

整个算法的效果如下:

  • 用 bbr startup 进行慢启动;
  • 若有新流量进入,srtt 增加,E 减少,Err 变为负值,C 持续收敛(效率取决于 PID 参数);
  • 若有流量退出,srtt 减少,E 增加,Err 变为正值,C 持续收敛(效率取决于 PID 参数);
  • 开启 probe,若 cubic 挤占 buffer,probe 后 E 增加,直到占据足够和 cubic 均分的 buffer,E 不再增加。
  • 关闭 probe,遇到 cubic 会吃亏,但与同类算法,vegas,bbrv3 可以公平共存。

若开启 probe,当 cubic 流量执行 md 时,E = bw / delay 会跟着变高,引发算法注入更多 inflight,但随着 cubic 流量卷土重来,E 会下来,而 PID 会把 inflight 再次拉低,若没有 cubic 流量,probe 只会让 E 变小而不起作用。

但在很多异步 cubic 流量存在的情况下,probe 的震荡效应并不明显,因为多流异步共享 buffer,单独流的行为对统计波动影响并不大,只要不发生全局同步,事情就当没发生,而全局同步的概率非常低。

有个细节值得一提。inflight 守恒算法对过冲非常敏感,因为它会引发拥塞加剧甚至丢包,而在 PID 控制中过冲几乎是一定的,因此需要稍微调整:

  • 调整 Kd 参数,收缩过冲;
  • 积分下限不从 0 开始,而是维持一个窗口。

由于 PID 收敛需要一个稍微久(主要由 Kp 参数决定)的过程,该算法时标相对长,对于精细时标可能并不有效,因此不适合 dcn 场景(只是可能,并没有深入分析论证)。在长时标场景,inflight 守恒是一个可容忍的收敛结果,通过调节 PID 参数,算法对抖动的抵抗力也有所不同。

浙江温州皮鞋湿,下雨进水不会胖。

  • 37
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值