在 vegas 为啥好 的篇中,我给出一幅 diff 的 diff 图像,提到了 vegas 绝大多数情况对带宽变化的敏感公平性以及 短肥管道(比如数据中心)的敏感不公平性,本文给出更直观的解释。
网络伸缩的不变量是 “瓜分或出让同一块 buffer 的能力”。无论 basertt 是 1000 还是 1,它们都以同样的力道对待同一块 buffer。
给出 queuing_delay 变化时的 diff 的图像是高尚的,由于引入了除 cwnd,basertt,diff 之外 queuing_delay 第四个变量,无法直观画四维图像,但可以将三维图像作为四维图像的快照投影(这也是我们处理时间的方法),比较两个即可。
给出 diff 表达式,设 cwnd 为 x,basertt 为 y,diff 为 z,给出两个不同 queuing_delay 时的 diff,观察两张三维面之间的距离。
先看一般情况:
y = x 的一般场景,覆盖了大部分的带宽和时延同步的管道,可发现在不同 queuing_delay 下,两张三维面几乎是等距的,而距离反应了 vegas 对 queuing_delay 变化的敏感度,等距意味着不同 rtt 的 vegas 连接对带宽流量退出和侵入等变化具有相同的敏感性,这对 basertt 很大的流是太好了。
再看短肥管道的敏感性不公平,basertt 稍微变化,diff 的 diff 就会变化很大,带宽越大,rtt 越小,不公平效应越明显:
y = alpha * x,alpha 越大,管道越短越肥,可见两个平面间的距离随着 x (带宽)增加差异越大。这种情况下,可以使用 diff 的吞吐版本取代 bdp 版本做偏置,即 diff = actual - expected,不再乘以 basertt:
之所以可以这么做,因为短肥网络带宽相对固定且受控,从管理员那里即可问出。 alpah < diff < beta 中的 alpha,beta 可配置为固定值。
犄角旮旯的边界条件下的不公平性都能采用类似方式解决,如果有相对固定的配置,就固定化它,加个 if 语句隔离,或者学 cubic tcp friendly 做法,对特殊的情况直接隔离回退,大可不必为罕见场景或非工作场景绞尽脑汁设计通用算法。
总之,特殊判断外加 aimd 兜底,就能让 vegas 变成实际可用的算法。
引个哲学话题,松弛,这也是最近读《道德经》的感悟,为了让绳子笔直,必须双手持续使力,但为什么要笔直呢?双手松开,绳子也不会弯曲到哪里去。
为维持在最大带宽和最小时延的最佳操作点,bbr 要持续检查,如果 bbr 真做到了清空队列,就不得不再引入 probe 机制探取带宽,队列清空做不准,做准后要 probe,这一切增加了复杂性,且结果依旧不准,正如双手持续使力,为何不放手呢,何必在最小时延维持,松弛后的结果不光增加 buffer 占用,还可自动 probe,drain。
松弛之后没有失去,反而获得。
很多经理根本不知道我在说什么,我的客体是一个可以在上面高效率跑流量的共享网络系统,而不是在一个共享网络系统上高效率跑流量,如果是后者,自然会得出相反的结论,显然我们说的 “效率” 不是一回事。经理有经理的难处,松弛一下,自然懂我。
浙江温州皮鞋湿,下雨进水不会胖。