少即是多:从 MPTCP 看优化干预的边界
“对待端到端传输,信息不足就要少干预,越干预越糟糕”,这是我的信条,这次再来说说 MPTCP。
Linux 内核 MPTCP 最好的调度算法就是 default 算法,没有之一,因为它以代价最小,最自然的方式做到了保序和聚合:
- 按最小 rtt 调度 next,确保多条 subflow 按序到达;
- 最小 rtt subflow 不断填充至非最小 rtt,回到 1,开始 roundrobin 聚合;
- 始终保持最小 rtt 的 subflow 将自然放弃聚合 subflow,说明数据量不足;
- 最小 rtt 调度,只要时间足够久,一定能稳定到最优状态,其它任何算法都能归结为最小 rtt 调度的
不同场景,只是为照顾某些特征,使用一些额外推算的信息优化局部指标,但在本质上,rtt 是唯一的输入信息,即便如此,仍需要对其平滑,以 srtt 算。
其它任何信息,注入实时吞吐的计算,rtt 梯度等均是二手信息,且属于高阶二手信息,而信息只有单方向作用力,一旦误判将会加倍抵消已获得的微弱收益。例如,本身 srtt 即加工信息,使用它做输入获得的任何新信息均属于高阶二手信息,风险极大。
大量论文上展示的花哨算法之所以中看不中用,恰在于它们假设高阶二手信息均是可信的,而在特定的仿真环境,它们确实可信,因为环境是可控的,而非实际现网随机的复杂自适应环境,甚至不携带最简单的统计复用特征。
我也玩过花活,提出笨鸟先飞的策略,先发送缓冲区后半部到 rtt 最大的 subflow,实属与最小 rtt 调度反着来,但多笨的鸟先飞多久马上浮现,循着这思路,同时坚守 “不使用高阶二手信息” 的原则,最终就走向了分 block,彻底解耦各 subflow 序列关联,最后把问题推给 buffer 管理,buffer 属空间维度,与最小 rtt 正交,看起来相互不犯也和谐。
空间策略与时间策略不同的是 buffer 管理得先有足够数据才能被调度,不是所有流都能随时产生足够多的数据,而时间流逝却不止,遵循文初描述的三点即可,这么看来,我的花活的适应性还是不如最小 rtt 调度。
在更一般的范畴,时间一直均匀流逝,时间维度的策略比空间维度的策略更加能适应几乎所有场景,而空间维度的策略更适用于单独追求高性能的场景,而性能等效于时间的倒数,用空间换时间自然而然,但空间策略的适应性更弱,统观全局,若要生存,若要展开,适应性要比高性能更重要,这又是一个辩证。
续喷 MPTCP,在于我要澄清另一个原则,“非技术经理不要追求技术指标,而要追求体验,QoE”。
一个商务经理(很多商务经理总强调自己以前搞过技术,估计是怕被忽悠,商务就商务,装什么懂技术)整天追 “MPTCP 的聚合效率” 是一种什么体验,比如他非要将 1Mpbs 和 100Mbps 聚合成 101Mbps,结果聚合结果只有 50Mbps,比不聚合还要差,到底谁错了?在我看来,我得告诉他正确结果不是 101Mbps,而是 100.373Mbps,我还要强调我是算出来的,真 TM 想扇他。
谁也没错,边界乱了。从一开始就不该让经理知道 “带宽”,“带宽聚合” 等名词,他们应该知道的是 “卡顿”。否则很容易陷入 “为聚合而聚合” 的陷阱,最终工人们会想花活来应对技术指标要求,弄巧成拙,比如要聚合 rtt = 1ms,300ms 路径,为 rtt = 1ms 的那条主动增加 300ms,结果却严重损害了体验。
做 TCP 优化时曾遇到过一位经理,嫌 srtt 抖动,要我们周内消除 srtt 抖动,经理以为这是个很难的工作,但对我们太简单了,把 srtt 历史权重提高到 0.95,经理的问题就解决了。如果经理不知道 rtt 这个概念,我们本想利用那周剩下的几天挑选长尾噪点做针对性优化。第二周经理发现 srtt 抖动降低了,吞吐还是不行,我怕他是不是又要折腾幺蛾子,果断请假,利用休假完成了我那经典的 1000 个 if 分支。
经理不应该学习技术,技术因果和管理因果完全不同,后者的对象是不讲内禀的。坚信 rtt 抖动消除了性能就提升比坚信加班就能完成工作更天真,因为 rtt 抖动是内禀的,而加班或许真的能完成工作,虽然大多数情况下不能。
说回 MPTCP。MPTCP 聚合路由器的意义是聚合不同运营商不同代系的带宽,平滑波动,使得在各种代系以及运营商覆盖率的场景下都能提供稳定高速的带宽,其中高速并非重点,由于各运营商地域覆盖率并不重叠,聚合路由器平滑差异,稳定少断网才是关键。
在技术层面,多路径是多路径,聚合是聚合,二者没什么太值得一提的关联,多路径算是未来传输技术的趋势,特别是未来摩尔定律失效后的高速传输领域,而聚合只是过渡技术,要聚合说明不够,够了就不需要聚合了。
喷 TCP,喷 BBR,喷 MPTCP,根本上还是看不惯有人不懂,怒其不争。
最后,做道题目:
一根长度为 L,截面积为 S 的厚橡皮水管,两个端点分别为 A,B,从 A 端注水,B 端出水时可充满截面积 S,假设在距离 A 端 x 处的水管上开一个面积为 y 的口漏水,若此时仍要 B 端出水时可充满截面积 S,对 A 端注水应该有何要求,从检测到漏口,A 端需要执行该要求多久,B 端才能重新充满截面积 S,与 x,y 的关系是什么?
然后用它来对带宽聚合建模。
浙江温州皮鞋湿,下雨进水不会胖。