当前位置: 首页 > news >正文

用 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 参数,算法对抖动的抵抗力也有所不同。

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

相关文章:

  • 存储无界限:MK米客方德SD NAND系列,小容量到大容量的全方位覆盖
  • 天软特色因子看板(2024.06 第8期)
  • 展讯-QMI8658和气压传感器驱动调试
  • Maven和JAVA_HOME的关系
  • 【ajax核心04】利用async、await解决显式promise链问题
  • Java中的大数据处理与分析架构
  • 头歌——机器学习——支持向量机案例
  • 解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
  • 红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全非约束系约束系RBCD资源系Spooler利用
  • 由 Vault 支持的 KES 的 MinIO Operator
  • 【INTEL(ALTERA)】Nios® II EDS 是否在 Windows 10 上受支持?
  • ansible copy模块参选选项
  • React useEffect 执行时机
  • 昇思25天学习打卡营第6天|使用静态图加速
  • Django 模版转义
  • $translatePartialLoader加载失败及解决方式
  • Angular 4.x 动态创建组件
  • conda常用的命令
  • css系列之关于字体的事
  • DataBase in Android
  • ES学习笔记(12)--Symbol
  • Golang-长连接-状态推送
  • HTTP请求重发
  • JavaScript的使用你知道几种?(上)
  • mac修复ab及siege安装
  • PHP CLI应用的调试原理
  • React组件设计模式(一)
  • tab.js分享及浏览器兼容性问题汇总
  • 产品三维模型在线预览
  • 从0实现一个tiny react(三)生命周期
  • 区块链技术特点之去中心化特性
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ### RabbitMQ五种工作模式:
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #include到底该写在哪
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (三)uboot源码分析
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)从 Java 代码到 Java 堆
  • .Net Remoting常用部署结构
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Autowired标签与 @Resource标签 的区别
  • @Bean注解详解
  • @selector(..)警告提示
  • [C++] new和delete
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [CISCN 2023 初赛]go_session
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜