BBR 讨论组 已经沉寂好久。

一个关于网络传输公平性的讨论,当我看到那些完全不面向人类的复杂算法时,我提到 “公平性很简单,只要所有的端都执行相同的策略,无论它多么简单,在统计意义上,所有的端就是公平的,无需算法调配”。

但我少解释了几个细节:

  • 所有的端对相同策略的执行时序一致,即全局同步;
  • 所有的端对相同策略的配置参数一致,初始化一致;
  • 没有任何算法可以做到全局分布式公平;
  • “公平” 和 “平等” 的含义本就不同;
  • 红绿灯需要,限速也需要,但交警和罚单也需要;

其推论很简单,“互联网上的传输流是不公平的”,这很容易解释,互联网是分布式统计复用网络,不可能全局同步,亦不可能配置参数初始化一致,我们熟知的 RTT 不公平,算法间不公平,皆出自此,且无法解决。

“公平” 和 “平等” 本不同,所有人都能参加高考是公平,大专和博士收入不同便是不平等,所有人从受精卵发育成人是公平,但基因配置参数,生长环境不同导致每个人都是特殊的便是不平等,就这个意思,AIMD 算法是公平的,但 alpha,beta,RTT 不同导致流间不平等。

故,上述第 4 点为前 3 点的通用兜底话术,以防止编程的人胡搅蛮缠。

但互联网仍然是高可用和统计公平的。这是一些 “社会机制” 保证的,而它们的本质都是负反馈,以上第 5 点确保前 4 点不是虚的。

首先旧事重提,还是看 AIMD。

设 R 为 RTT,W 为每条流的平均 cwnd,p 为丢包率,简单写出其微分方程形式:

d W d t = 1 R − p ( t ) ⋅ W ( t ) 2 2 R \dfrac{dW}{dt}=\dfrac{1}{R}-\dfrac{p(t)\cdot W(t)^2}{2R} dtdW=R12Rp(t)W(t)2

其中第 2 项可以理解为,每次丢包窗口减少 W/2,窗口的减少速率 = (每秒丢包数) * (每次减少量),即 λ ( t ) ⋅ p ( t ) = W ( t ) R ⋅ p ( t ) \lambda(t)\cdot p(t)=\dfrac{W(t)}{R}\cdot p(t) λ(t)p(t)=RW(t)p(t),其中 λ \lambda λ 为吞吐率。

统计意义上,丢包率 p 与流总量 N 与 W 乘积正相关,有目共睹,可给出一个简化的正比关系:

p ( t ) ≈ k ⋅ ( N ⋅ W ( t ) R − C ) p(t)\approx k\cdot (N\cdot\dfrac{W(t)}{R}-C) p(t)k(NRW(t)C)

将其代入 d W d t \dfrac{dW}{dt} dtdW,得到一个与 W 的 3 次幂关系,一个负反馈很容易看到:

  • W 过高,p 升高,dW/dt 变成负数,W 下降,p 下降,dW/dt 变正,W 升高;

稳定状态下,导数为 0,可得:

W ∝ 1 p W\propto\sqrt{\dfrac{1}{p}} Wp1

这就是 AIMD 吞吐率与丢包率的关系变体,留着后面讲 codel 时还有用。

OK,AIMD 这个 “所有的端对相同策略” 构成了第一个负反馈,它是公平的,即时参数,RTT 的相异导致了不平等,它也是收敛的,这是互联网可用性的第一基石,照顾到每一个终端,无论如何,端侧相图收敛到稳定是第一要事。

在端到端收敛的基础上,为提高资源利用率,网络侧同样需要类似的确保收敛到稳定状态的负反馈,我以 AQM 距离,其中重点要说的是 RED 和 Codel。

RED 为避免全局同步 MD 而被提出,具体细节不赘述,直接看它的收敛到公平的负反馈。

q a v g q_{avg} qavg 为平均队列长度, q i n s t a n t q_{instant} qinstant 为即时队列长度,则:

q a v g = ( 1 − β ) ⋅ q a v g + β ⋅ q i n s t a n t q_{avg}=(1-\beta)\cdot q_{avg}+\beta\cdot q_{instant} qavg=(1β)qavg+βqinstant

设 Min 为最小丢包阈值,Max 为最大丢包阈值,P 为基础丢包率,则路由器的丢包率可表示为:

p ( q a v g ) = { 0 , q a v g < Min P ⋅ q a v g − Min Max − Min , Min ≤ q a v g ≤ Max 1 , q a v g > Max p(q_{avg})=\begin{cases}0, & q_{avg} < \text{Min}\\P\cdot\dfrac{q_{avg}-\text{Min}}{\text{Max}-\text{Min}},& \text{Min}\le q_{avg} \le \text{Max}\\1,&q_{avg}>\text{Max}\end{cases} p(qavg)= 0,PMaxMinqavgMin,1,qavg<MinMinqavgMaxqavg>Max

丢包事件在时间上分散开,避免了全局同步。这里的重点不在于算法细节,而是显而易见的负反馈:

  • q a v g q_{avg} qavg 越大,p 越大,端侧 AIMD 响应后降 cwnd, q a v g q_{avg} qavg 降低,p 降低,cwnd 升高;

公平性来自行为本身,越快的流被随机抽中概率越高,1/p 中占比越高,响应越激烈;

但对于固定概率 p,简单随机丢包会使丢包事件在时间上呈现泊松分布,具有聚集性。更直观地,假设每 ms 有 1 个包到达,p=0.001,每秒期望丢包数为 1000 × 0.001 = 1 个,但丢包可能集中在某几毫秒内,其他时间没有,这仍会导致同步 MD(虽然不再是 buffer overflow 后的全局同步)。

因此,RED 会引入一个随机化因子,进一步平滑丢包间隔,即:

p a c t u a l = p 1 − count ⋅ p p_{actual}=\dfrac{p}{1-\text{count}\cdot p} pactual=1countpp

其中,count 为上一次丢包后迄今没有丢弃的包数量。使用 count 后,丢包间隔被强制分散,丢包时间间隔更加近似均匀分布而不是指数分布。

以红绿灯为例,没有 count 加持的标准 RED 类似每个路口单独部署独立的红绿灯,而引入 count 随机化因子后就属于各个路口的红绿灯联动了,进而可产生绿波,避免恰好所有车在道路空闲时同时停止。

OK,RED + 随机化因子这个负反馈已经说完了,它同样确保了稳定收敛,携带公平,所谓稳定收敛就是随着 q a v g q_{avg} qavg 的上升, q a v g q_{avg} qavg 一定会恢复到 Min 以下。

RED 很好,但 RED 的问题也很快暴露:

  • 如果是突发流则如何,q 短暂增加,瞬间恢复,造成了不必要丢包;
  • q 多大算大,如果带宽 B 很大,大的 q 也会很快消耗,需要与 B 关联;

那么 q 除以 B 即排队时延了,基于一个经验的,可接受的时延期望做丢包阈值度量,要合理得多,这就是 Codel 的背景。

“经验的,可接受的时延期望” 不以网络为转移,它不受 RTT 变化影响,它仅决定于应用类型,因此放之四海而皆准,无论在广域网还是在数据中心,比如 5ms 就是这么一个排队时延阈值,只要排队时延超过 5ms 持续了 D 时间,就开始丢包并计数丢包量 count(注意与 RED 随机化因子的 count 已经无关,这里讲的是 Codel),丢包间隔 I 为:

I = 5ms count I=\dfrac{\text{5ms}}{\sqrt{\text{count}}} I=count 5ms

就这一个公式,显然比 RED 优雅,负反馈自带其中:

  • 只要排队时延不跌入 5ms 以下,Codel 丢包就会持续加剧,加剧丢包使 AIMD 加剧反应,排队时延跌到 5ms 以下;

比较重要的是 1 count \dfrac{1}{\sqrt{\text{count}}} count 1 的关系,它具有这种形式是因为 TCP 吞吐率对丢包率的 p \sqrt{p} p 依赖性,它是和 AIMD 吞吐率 T 与丢包率 p 关系公式完美契合的,我将再次从 W ∝ 1 p W\propto\sqrt{\dfrac{1}{p}} Wp1 开始。

为了让 Codel 丢包促使端侧 AIMD 平滑线性收敛到稳定值,需要明确丢包率如何升高,不能太快而过冲,也不能太慢而持续拥塞。

由于在控制系统中,被控对象 TCP 具有二阶非线性动态特性,为了获得线性闭环响应,Codel 应该补偿这个 p \sqrt{p} p 平方根非线性效应。

从 RED 可知,简单的随机丢包率 p 的丢包间隔具有指数分布特征,需要随机化因子来平滑时间,因此相比调节丢包率 p,直接调节丢包间隔 I 显得更直接,Codel 采取逐步缩短丢包间隔来形成负反馈,大意就是,你若不改正,我就加大力度丢包。

丢包间隔 I 与丢包率,丢包量满足 I ∝ 1 p I\propto\dfrac{1}{p} Ip1,在固定的 I,有 p ∝ count p\propto\text{count} pcount,为了让 AIMD 随每个丢包间隔 I 线性下降速率 T,设 R 为 RTT,需要以下的关系:

T = W R ∝ 1 p = k ⋅ I T=\dfrac{W}{R}\propto \sqrt{\dfrac{1}{p}}=k\cdot I T=RWp1 =kI

若通过改变 I 来调节 p 满足上式,则需要:

I ∝ 1 p ∝ 1 count I\propto\dfrac{1}{\sqrt{p}}\propto\dfrac{1}{\sqrt{\text{count}}} Ip 1count 1

这就是丢包间隔关系的推导,其描述见 Controlling Queue Delay - A modern AQM is just one piece of the solution to bufferbloat.:

The next drop time is decreased in inverse proportion to the square root of the number of drops since the dropping state was entered, using the well-known relationship of drop rate to throughput to get a linear change in throughput.

以上三个负反馈的例子,就是我在文初所谓的 “社会机制”:

  • AIMD,你要遵循一致的规则;
  • RED/Codel,保证你遵循这个规则;

你不但要有意识共识,外界还要有监督,这就是保证一个分布式统计复用系统可用性和稳定性的原则,社会是这样,互联网也是这样。

剩下还有一个原则我只字未提,即 “端到端的流量控制”,原因在于这属于私人范畴,于统计系统无关,只要有 W = min(cwnd, rwnd) 兜底,流控就无法进入公共领域,同理的一个私人范畴的例子是 BBR,从 Google 发布它开始迄今,BBR 一致在私人范畴被优化,它只为提高个别流量的吞吐,值得注意的是,BBR 在 Google 内部骨干网并非没有被公共权力管辖,它的部署环境是 G 家的 B4 骨干,而这是一个 SDN 网络。

当 BBR 进入广域网而脱离公共权力管制后,它带来的只是加重 bufferbloat 而非它宣称的缓解。BBR 淡出只是个时间问题,加之随着全世界卷入 AI,果不其然,BBR 已死:
在这里插入图片描述

好事。

评论时间。

只要你接受分布式统计公平,系统注定就不会最优化,反之亦然,最优化的系统一定要么不公平,要么集中独 cai,这是一对矛盾。无法最优化的本质在于信息的缺失,而信息缺失的表现则是统计方差,就是所谓波动,这是系统固有的。

不要总是试图控制网络带宽,这是不可能的,我常说编程的人不懂网络就是此意,编程的人天真地以为只要为带宽时延加上一个预制参数,就一定会获得预期结果,如果没有得到这结果,就是参数不对或程序 bug,没完没了 debug,浪费多少昼夜依然无果。

编程的人面对 get,set 有预期行为,这是 API 规范,行为背后多是单体。与分布式系统不同,单体返回明确,成功或失败,以及失败原因,但 TCP/IP 不同,尽力而为真可能无所为,从不承诺确保任何行为,也就无法信任它的任何返回,这对编程的人是不可接受的。

换句话说,单体靠明确的返回来反馈,而分布式系统则靠负反馈控制行为。

编程的人有所不知,这些负反馈原则在 TCP/IP 网络之外早就存在于我们的社会,提到这个,编程的人就越发感觉这些个 AIMD,RED/Codel AQM 不在 “技术” 范畴,在编程的人的认知里,技术和社会学是抵触的,社会总是不那么数学。

话要倒着理解,其实不是社会不技术,而是网络就是社会学,而编程只占真正技术领域的一小丢丢丢。那么举几个编程的人能理解的例子,来结束本文吧:

  • 按固定数量招聘,按比例裁员,这就是 AIMD,招聘加法增,裁员乘法减,被开除一次就理解了;
  • 道路桥梁慢慢开通,交通量饱和后直接单双号限行,试图乘法减一半流量,被限行一次就理解了;
  • 烟酒,高脂高盐高糖加法堆积着负担,不适后戒烟限酒,药品,节食加运动,体检一次就理解了;
  • 外地牌照限行,外地户口限购,这些不止约束了资源占用,更影响着被限着的行为,这就是 AQM;
  • 酒是慢慢喝,呕吐断片只在一瞬间,这也是 AIMD;

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐