![cover](https://img-blog.csdnimg.cn/direct/7c61b6e363d34d749d8271c028c707e0.jpeg)
用 PID 优化拥塞控制
PS:这本书非常不错,但并非专业计算机范畴的作品,控制论大多数被应用在机械自动化,电子自动化,航空航天,机器人,运筹学等,但拥塞控制肯定也属于控制论范畴,这一点我早就提到过。端到端可靠传输协议作为典型的闭环反馈系统,看起来也能用 PID,以前曾思考过这问题,参见 TCP拥塞控制和PID控制器,然而网络传输并非线性系统,PID 相对不好使,但选对目标误差,让 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)+Ki∫0te(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(ei−ei−1)
现在准备将它作用于 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 参数,算法对抖动的抵抗力也有所不同。
浙江温州皮鞋湿,下雨进水不会胖。
更多推荐
所有评论(0)