作为一个流通和兑换系统(与被发送速率兑换出的带宽不同,公路交通不是兑换系统,车辆只是单体),网络传输与货币流通和兑换是一回事,借一些经济学术语能更深刻理解拥塞的成因和缓解以及制定拥塞控制策略,这是一个新视角。
再看 AIMD 收敛图:
读图可得下列结论:
- buffer 越大,收敛越慢。
- 收敛时间与 buffer 大小等比例变化。
- 所有流总带宽等于链路瓶颈带宽。
- 流有效带宽与流 bdp 等比例变化。
这些结论带来一些推论。
无论 buffer 多大,总带宽不发生任何变化。buffer 丰富,但带宽稀缺,sender 不得不进入竞拍模式,随 buffer 增加用更大发送速率挤兑相同带宽。换句话说,发送速率必须与 buffer 等比增长,才能兑换相同的带宽,这很类似物价上涨,买同样东西要花更多的钱。
投资高速网卡卖出去会有收益,但买家的端到端吞吐却没提升,sender 不得不用力挤占 buffer 以获得特定占比而兑换所需带宽,大部分努力被 buffer 吞噬,而这部分损失的能量(从生产高速网卡到卖网卡的一切劳动付出的能量)永远浪费了。
另一方面,若 buffer 无穷,AIMD 收敛图的 AI 无限延伸,没 MD 照样公平收敛,但限于物理天花板,buffer 有限,就需要 MD,MD 的物理意义是 “在等比例缩放的更小范围重新 AI,等比缩小,收敛也更快”,这是从几何上反推的收敛动力学。
以上结论和推论对硬件供需的影响更大。
由于网络转发节点的串联关系,瓶颈带宽符合木桶原则,单个设备提高带宽很难让客户看到端到端吞吐收益,但增加 buffer 确实降低了端到端丢包率,明显提升突发耐受性,但当节点 buffer 不断增加时,如前所述,sender 便不得不更换更快的网卡,这是不得不做的,做了不会提升吞吐,但不做就会降低吞吐,竞拍效应和内卷一致,等量的稀缺价值不得不支付更多努力。
问题出在哪?
问题就在 buffer 变大了,而 buffer 占比又是衡量兑换带宽占比的指标,填满越来越大的 buffer 需要越来越快的网卡。将 buffer 理解为储备金,buffer 越来越大就是通货膨胀。同样,burst 看作借贷,贷入的是时间,表现为时间的倒数,即速率。
buffer = 1 的正常情况(只有流通中货币)下,发送 D 字节数据的时间等于 t = n*D / T,连续两个字节的间隔为 n / T,其中 T 为共享链路瓶颈带宽,n 为流数。当 buffer 增加 x 倍,发送速率必须增加 x 倍才能保证兑换 T / n 的带宽,否则自己的带宽就会被其它流轻易挤占,毕竟保持自己的带宽很容易,只要加倍努力即可,但也很难,凭什么要加倍努力只为维持。
通货膨胀往往和低利率(包括存款和贷款)互为因果。要解决它,要么通货紧缩,要么提高利率(包括存款和贷款)。和问题成因对应,紧缩和提高利率也相辅相成。
减少 buffer 意味着紧缩,借贷以时间来衡量,则高利率意味着要偿付更多时间。shallow buffer 下越快发送意味着越多的时间借贷,引发越频繁的 buffer overflow 意味着要偿付更多 retransmission 时间,这恰体现了借贷高利率。另一方面,从储蓄存款利率的角度看,越慢发送意味着越多的时间储蓄,shallow buffer 场景下可获得越高的有效发送率,因为报文之间间隔越长,避开 buffer overflow 的概率越大,这恰体现了存款高利率。
不改变 buffer 大小,仅调整 RED 丢包阈值和丢包程度也能等效 “利率调整”,只要让 sender 被动偿付更多时间的调控方向都指向高利率,出来混早晚要还,借入了时间,需偿还更多时间作利息,这就是 retransmission 的代价,反之,提升报文有效通过率的调控方向则指向低利率。
从借贷角度看,未发生 buffer overflow 的情形来自于 sender 及时 “归还” 了 “借来” 的时间,表现为一轮 burst 后的静默,这轮 burst 时间与下次发送之间 “刚刚好(不至于过久而有损自身抢占能力,不至于过短增加 overflow 风险而增加 retransmission 时延)” 的静默时间,作为本息归还。
网络传输本身就是投资,付出发送成本并获得带宽收益,对于刚兑传输协议比如 TCP,成本即必须连本带息归还的借贷时间,无论 burst 后静默的及时归还是表现为 retransmission 的延期归还,利息都是时间,这段时间对 receiver 是无效时间。无论本息,都是支出,而收益则是靠非利息支出挤压出的带宽。同时,风险则意味着过度借贷导致的过度 retransmission 甚至连接崩溃。但对于柔性协议比如 UDP,可借贷而不还,利用大 buffer 而进而有能力抢占大量带宽,除非 QoS 监管介入。
…
So?
网络拥塞状态取决于链路交换节点的串联特征,当任意一交换节点在本地视角下获得拥塞信号,包括不限于队列增加,瞬时 burst 加剧,都可通过调整 buffer 大小 or RED 参数进行 “宏观调控”。
可以继续购买大 buffer 设备,但这只意味着该设备的宏观调控能力更强,动态范围更大,而并没有倒逼终端用户购买更快的网卡而影响供需,这就算大善事。
拥塞控制核心从 sender 转移到交换节点,sender 从主动 AIMD 转移到被动响应交换节点的调控,整个拥塞控制的架构要大不同。测量 queuing delay 将没有意义,因为 buffer 和 RED 参数不再固定,盲目激进发送将支付高额的时间成本作为利息,根本不 care 丢包的柔性协议将遭受无声的惩罚。无他。
拥塞控制算法从 sender alg 转移到 buffer 调整,作为宏观调控,从而帮助新的 rate-based 的 probe 协议(比如 BBR)更好维持自身状态机的稳定转换,与 AIMD 流量一起被纳入统一规则。
对于微观调控,我曾经写过一个畅想:激励式拥塞控制,简单评价就是采用激励替代惩罚,你好他也好,这种微观调控方法非常巧妙,let me tell you why.
在百万级连接中找到抢占带宽占比最大的 top n 对它们实施限速惩罚非常困难,成本高昂,但反过来,与促进经济良性竞争和共同发展类似,对良性连接进行补偿激励却很容易。做法很简单,将所有报文 hash 到有限个 queue,hash 算法随时间不断调整(如 seed 每 5 secs 加 1),在每一时刻,优先调度 queue length < alpha 即可。原理很直观:无论 hash 算法如何变,激进连接的报文所在的 queue 总会很长而得不到补偿,另一方面,如果某些良性流在某次不幸和激进流共处一 bucket,“持续的” 补偿激励会平滑掉 “这一次” 没得到激励补偿的损失,且这种不幸对所有良性流平等,最后,连续和激进流 hash 到同一 bucket 的概率极低使这个微观调控策略具有可行性和有效性。
…
But?
但数据中心是一种不同的 “流通和兑换” 系统,它确实需要高速网卡,但它却不提倡大 buffer,在直觉上和上面的论述相反,但本质往往与直觉相悖。
稍微质疑一下因果。真的是广域网的大 buffer 错了吗?如果广域网不该有大 buffer,配置小 buffer 会引入新问题吗?在广域网如此多的海量接入终端的背景下,突发无处不在且不可预知,小 buffer 无疑会造成非常高的丢包率,一个报文被丢弃,那么发送该报文的能量就被白白损耗掉了,广域网平均路径长,越接近目的地的丢包,能量损耗越大,这是自然而然的推论。
数据中心的小 buffer 没错,广域网的大 buffer 也没错,经典拥塞控制方案也建议 buffer_size >= bdp,而广域网的 bdp 不会小,即使不能兑换有效带宽,即使可卷起网卡军备竞赛,大 buffer 也必要,似乎都没错,于是问题又回到 buffer 到底该有多大,这显然在循环论证。 用网络术语讲,buffer 为吸收统计突发被引入,但什么是突然,如何度量突发,很容易陷入循环论证。
如果用经济学术语描述就简单多了,从储备金或准备金的意义去理解 buffer 很合适,我们发现,广域网大 buffer 确实不是问题原因,而是 sender 行为的结果。 无需区分准备金和储备金作用的不同,这两种 “金” 都作为银行的 buffer 存在,以应对客户的存款和贷款需求,平滑二者之间的 gap,比如 user1 存了 100 块,user2 贷走了 50 块,此时 user1 来取他的 100 块,但银行只有 50 块,为了让 user1 正常取款而不违约,这 50 块的 gap 就由银行自己的钱来提供,这显然就是一个 “缓冲” 的作用,姑且将其称作 “备金”,类似水库,为了满足下游源源不断的用水量,必须存一部分水,这都不用解释,非常容易理解。
现在重点是,所谓 buffer 吸收突发,就是 buffer 作为备金而放贷,前面说过,sender 贷入的是时间,而 buffer 则提供这种贷款,比如 buffer = 1GB,在一条 1GBps 链路上,原先 sender 发送 1GB 需要 1s,现在 buffer 可以提供 1s 的 “贷款”,这意味着 sender 可以一瞬间(任意短的时间)发送 1GB 而无需再等待 1s。
设想一个小 buffer_size = 1MB,带宽 = 1MBps 的链路,1000 个 sender 以 1MBps 发送,平均来看,有 999 个 sender 因 “银行没钱而贷不到款”。
从借贷供需看,显然,sender 越多,贷款需求越多,需提供的备金越大,buffer 就越大,这正是广域网大 buffer 的成因,而数据中心恰恰相反,sender 数量可控,拓扑确定,bdp 相对确定,短消息交互,个体贷款需求少,典型的 incast 可视作挤兑或挤贷,转瞬即逝,不足挂齿。
大 buffer,银行有足够的钱提供借贷服务,在 sender 侧,摩尔定律也在促进网卡更新换代,这是典型的 “繁荣经济” 周期,在这种周期内,大 buffer 导致的高 burst 率不断推高贷款利率(丢包重传),反过来抑制 burst 率,丢包率维持在一个范围内震荡。
这让人想起了几年前的良性繁荣经济,没事就从银行借点钱花,因为工资高且对未来充满信心,利率高也不怕,直到高到一个离谱的水平抑制人们贷款的欲望。在良性周期,花更多的钱买同样的东西是普遍现象,因为物价上涨了,人们变得更辛苦往往是因为虽然工资也上涨了,但人们由于预期良好拼命加杠杆,负债太多,而负债终要还的。这种行为吹起一个又一个泡沫,人们对一个特定物件加杠杆的行为会影响这个物件的供需产生影响,最终将这件东西的价格泡沫化,比如房子。
回到 buffer,如果 sender 网卡不断更新换代,buffer 不断加大,但带宽却没有增加,这就是泡沫,现实情况还好,带宽最近确实有所增加。
带宽不能像 buffer 一样线性增加的原因很容易理解,buffer 只需要复制空间,而带宽却要挤压时间,内存插两条就翻倍,CPU 速度翻倍要等十几个月,这就是现实。另一方面,现代 TCP/IP 网络拓扑逃不开一个收敛比的问题,n 个节点组成的网络,增加一个节点,交互流量潜在增加 n 倍,指数关系意味着注定存在的枢纽节点就像一个中央银行,只能用大 buffer 调控 burst,我之前聊过一个 incast 的解决方案,把拓扑改了就行。
…
好了,先这样,下次从 receiver 侧继续。
皮鞋没有蹬上,露着白袜子。
浙江温州皮鞋湿,下雨进水不会胖。