Google BBR拥塞控制算法背后的数学解释

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

杭州待了一段时间,回到深圳过国庆假期,无奈温州皮鞋?厂老板过节要回温州和上海,不在深圳,也就没有见着,非常遗憾!

国庆节当天,就写这个了。经理不会弹琴,但是经理会弹琴。

我原本可能会在想国庆节的凌晨到大清早写点什么呢,现在不用想了,就写BBR拥塞控制算法背后的数学吧,这个事情我是在杭州回深圳的路上突然找到了最终结果的,我必须把它记录下来。其实在找到这个结果之前,很久很久,我就在思考这个问题了。

背景和动机

2016年大概十月中下旬,同事推荐了一个视频:
Making Linux TCP Fasthttps://www.youtube.com/watch?v=hIl_zXzU3DA
跟随视频后的链接netdevconf的链接,还有一些slides和paper可以看:
https://netdevconf.org/1.2/session.html?yuchung-cheng
我也是那时,或者更早些一点,大概九月份的时候,接触了Google的BBR算法,应该算是国内第一批次的了,随后的一段相当长的时间,我对该算法进行了相对深入的剖析以及思考,从解释Paper,分析源码,设计到优化,反正不知花了多少周五的通宵。

随着后续这个BBR算法的逐渐普及,加入讨论的人也越来越多了,从最初的如何用起来到后面的各路大神的各路神技,可谓热闹非凡,我当时讲,TCP被你们玩坏掉了,BBR也难逃劫难…

和CUBIC背后那精湛简介的数学收敛模型不同,BBR是基于测量的一个算法,它甚至没有一个数学上的解释以证明 为什么这样做就是最好的,以至于,很多人开始盲改,最终的效果和自己的预期,当然是大相径庭。

我一直在思考BBR背后的数学,我总觉得能用数学公式表达的东西才是真正确定的,所以我希望在我长时间思考后,能有一个数学上的解释,来解释BBR为什么是高效率的,为什么只能这样做。

这几天,我感觉成功了一点,所以不敢独享这回报,写此文以分享。


插曲

先来个插曲。

很多人看到BBR不排队的特征后,第一想到的就是 不排队甚好,但稍微在缓存队列里堆点数据包也不错,不然怎么能赢了那些不守规矩的流呢?  于是乎就出现了各类所谓的 BBR优化,无一例外地都是把Reno/CUBIC那一套算法的 精髓 照搬到BBR,于是BBR就被玩坏了!

我也干过这种事,后来我跟BBR的作者Neal Cardwell交流,他告诉我 这增加了算法的复杂性,并且破坏了BBR的根本

我退出了 BBR优化队伍,我也不玩了,我潜下心希望能 从数学上证明BBR不排队就是最优的,只要排队就不行,一点队列也不行。本文写作前一天,我得了一些结论。记录这些结论并记录我是怎么想的,就是本文的主要内容。

温州皮鞋厂老板促使我开了场,让我第一次用数学来描述BBR算法。

当时是要计算一下 ***为什么BBR在Startup阶段的gain是 2 l n ⁡ 2 2 ln ⁡ 2 l n 22 ​ 2ln⁡2\dfrac{2}{\ln 2}ln22​ 2ln2ln22ln22***,详情看这里吧:
TCP BBR Startup gain计算总结和Startup失速问题https://blog.csdn.net/dog250/article/details/80780346

现在,正文开始。


正文

先说一下我的思路,由于我自从中学开始就是一个深度的数形结合控,希望能把一切都画在一个坐标系里,然后无非就是找最高点,最低点,找规律这些了,所谓求极值,展示特征无非也就是那些惯用的方法, 求导,积分,数列展开这些,所以对于BBR算法,我依然循着这样的思路。

现在要做的,就是怎么把BBR的行为画在一个坐标系里。如果这一步做到了的话,我相信以我20年的经验顺水推舟事情就一定能成。

其实,BBR最初的slides和paper中,不断展示的图示是下面这个:
在这里插入图片描述
然后,我仔细观察了这两个坐标系,分别是BW(其实是Deliveryrate) vs Inflight以及RTT vs Inflight,都有Infligh。其实,这两张图是用于展示BBR特征的,它只说了What,并没有解释Why,实际上,难道Inflight不应该是 计算出来的 吗?如果说我能根据另一个坐标系的曲线进行一系列计算,最后 推导出Inflight的值必须是那个值才能达到某种最优的效果,那就解释了Why。

就是这个思路。让我们一步一步去做。

既然我们把Inflight当成了一个结果而不是原因,为了找这个原因,我们合并两个坐标系,消去公共的Inflight,那么我们就可以得到RTT vs BW的曲线了!

为了数学上表述的方便,后面统一一下符号:
BW: w w w www www
RTT: t t t ttt ttt
Inflight: f f f fff fff
临界的Inflight: f c f c f c ​ fcf_cfc​ fcfcfc

下图是消去 f f f fff fff的方法:
首先给出图像的方程表示:

KaTeX parse error: Expected '}', got '&' at position 16: r={1f≤fcf−fc−1f&̲gt;fcr = \begin…

KaTeX parse error: Expected '}', got '&' at position 13: w={ffcf≤fc1f&̲gt;fcw= \begin{…

在这里插入图片描述
很简单,方程组联立就可以消去变量 f f f fff fff

我们可以看到,最终 w w w www www t t t ttt ttt的取值范围就是那条开向第二象限的折线,现在的问题是,在这条折线中, P ( w , t ) P ( w , t ) P ( w , t ) P(w,t)P(w,t)P(w,t) P(w,t)P(w,t)P(w,t)在哪里是最优的,而此时的Inflight值就是最适合灌进网络中的数据包的数量,换句话说,它反映了Cwnd应该取什么值。

问题转化为了 如何度量所谓的最优

一般工业界和经济学领域都会采用 ***产出/成本***的比值来衡量一个系统是不是优秀,换句话说就是 最优的系统是用最少的代价换取最高的收益。对于我们目前的模型而言,用语言来表达,即 最少的时间传输最多的数据包

因此,很显然,我给出下列的比值,最为衡量系统是否最优的度量:
E = w t E = w t E = t w ​ E=wtE=\dfrac{w}{t}E=tw​ E=wtE=twE=tw
问题变成了 P(w,t)取在哪里,上述的比值E最大?

肉眼看得出来, w w w www www取最大值 w m a x = 1 w m a x = 1 w m a x ​ = 1 wmax=1w_{max}=1wmax​=1 wmax=1wmax=1wmax=1 t t t ttt ttt取最小值 t m i n = 1 t m i n = 1 t m i n ​ = 1 tmin=1t_{min}=1tmin​=1 tmin=1tmin=1tmin=1即可,即取点 P e ( w m a x , t m i n ) P e ( w m a x , t m i n ) P e ​ ( w m a x ​ , t m i n ​ ) Pe(wmax,tmin)P_{e}(w_{max},t_{min})Pe​(wmax​,tmin​) Pe(wmax,tmin)Pe(wmax,tmin)Pe(wmax,tmin),所谓的最优的 E E E EEE EEE值就是 111 111 111,而此时,Inflight的值就是所谓的 B D P = w m a x × t m i n = f c = 1 B D P = w m a x × t m i n = f c = 1 B D P = w m a x ​ × t m i n ​ = f c ​ = 1 BDP=wmax×tmin=fc=1BDP=w_{max} \times t_{min}=f_c=1BDP=wmax​×tmin​=fc​=1 BDP=wmax×tmin=fc=1BDP=wmax×tmin=fc=1BDP=wmax×tmin=fc=1

这确实说明了Inflight取值为临界的恰好要使得队列增加的
f c f c f c ​ fcf_cfc​ fcfcfc时,系统的效能真的是最优的。

在这里插入图片描述

如果你将 P ( w , t ) P ( w , t ) P ( w , t ) P(w,t)P(w,t)P(w,t) P(w,t)P(w,t)P(w,t)在允许的定义域值域稍微偏离 P e P e P e ​ PeP_ePe​ PePePe点,你会发现 E E E EEE EEE值均会减少,这反映在TCP数据传输上,就是:

  1. 要么带宽没有用满,没有达到 w m a x w m a x w m a x ​ wmaxw_{max}wmax​ wmaxwmaxwmax;
  2. 要么带宽超额了,数据排队了,数据到达的太快,因此延迟增加了;

无论发生了上述的什么情况,显然都不是什么好事。

这算完成了任务吗?证明了BBR是最优的。看起来算是吧…


如果这样就算是一个BBR背后完备的数学模型,这篇文章一个多月前就能写出了。。。


我们发现,上面的推导基于一个明显的事实,即 用肉眼看,之所以可以用肉眼观测出最值,那是因为Yuchung Cheng和Neal Cardwell在描述BBR算法时,简化了模型,基于简化的模型,才给出了那两幅BW vs Inflight和RTT vs Inflight的坐标图示,在这两个图示中,所有的线均为直线。

所谓的简化模型,即假设数据包是间隔均匀匀速到达的,数据包也是匀速经过网络节点设备的。但是在实际上,这并不是事实,真实的情况画在坐标系里并不是直线,而是曲线,类似下面的样子:
在这里插入图片描述
此时如果我们依然要求解 E = w t E = w t E = t w ​ E=wtE=\dfrac{w}{t}E=tw​ E=wtE=twE=tw的极大值,很显然要求这条曲线函数 t t t ttt ttt针对 w w w www www的导数,这下麻烦有点大!我怎么能知道带宽 w w w www www和传输时间 t t t ttt ttt之间的关系呢?显然,必须有二者之间的关系,才能求导啊!

怎么办?这件事让我搞了一个多月时间!

我能理解数据包的到达其实是柏松到达,被服务时间符合指数分布特征,但是我并没有就着这个思路思考下去(不然我一定能想到排队论),而是希望能先有一个通用的解。

起初,我是反着求解,我假设传输时间 t t t ttt ttt已经可以用带宽 w w w www www来表示,即
t = f ( w ) t = f ( w ) t = f ( w ) t=f(w)t=f(w)t=f(w) t=f(w)t=f(w)t=f(w)
然后,就会有:
E = w t = w f ( w ) E = w t = w f ( w ) E = t w ​ = f ( w ) w ​ E=wt=wf(w)E=\dfrac{w}{t}=\dfrac{w}{f(w)}E=tw​=f(w)w​ E=wt=wf(w)E=tw=f(w)wE=tw=f(w)w
进一步按照求导法则针对 w w w www www求导,推导如下:
E ′ = w × d f ( w ) d w − f ( w ) f 2 ( w ) E ′ = w × d f ( w ) d w − f ( w ) f 2 ( w ) E ′ = f 2 ( w ) w × d w d f ( w ) ​ − f ( w ) ​ E′=w×df(w)dw−f(w)f2(w)E\prime=\dfrac{w\times \dfrac{d f(w)}{d w}-f(w)}{f^2(w)}E′=f2(w)w×dwdf(w)​−f(w)​ E=w×df(w)dwf(w)f2(w)E=f2(w)w×dwdf(w)f(w)E=f2(w)w×dwdf(w)f(w)
若求 E E E EEE EEE的极大值,那么它一定出现在曲线的拐点处,其导数一定为 000 000 000,因此:
E ′ = w × d f ( w ) d w − f ( w ) f 2 ( w ) = 0 E ′ = w × d f ( w ) d w − f ( w ) f 2 ( w ) = 0 E ′ = f 2 ( w ) w × d w d f ( w ) ​ − f ( w ) ​ = 0 E′=w×df(w)dw−f(w)f2(w)=0E\prime=\dfrac{w\times \dfrac{d f(w)}{d w}-f(w)}{f^2(w)}=0E′=f2(w)w×dwdf(w)​−f(w)​=0 E=w×df(w)dwf(w)f2(w)=0E=f2(w)w×dwdf(w)f(w)=0E=f2(w)w×dwdf(w)f(w)=0
f ( w ) = w × d f ( w ) d w f ( w ) = w × d f ( w ) d w f ( w ) = w × d w d f ( w ) ​ f(w)=w×df(w)dwf(w)=w\times \dfrac{d f(w)}{d w}f(w)=w×dwdf(w)​ f(w)=w×df(w)dwf(w)=w×dwdf(w)f(w)=w×dwdf(w)

这便是最终的关系式,虽然我不知道 t t t ttt ttt如何用 w w w www www来表示,但这个关系是存在的,这是个普遍适用的关系。

我为得到这个关系式兴奋了一个周末,非常有成就感,虽然它现在看起来很简单,但在当时,这个想法真的显得来得太晚!

我是从初中开始就喜欢摆置坐标系的,一直到大学,几乎任何数学题,我都能采用数形结合的方案一题多解,某种程度上,我老婆就是当时我如此炫技追到的…最近几年,我用同样的方式设计了iptables的优化方案,DxR的优化方案…不多的几次失败包括Bloom Filter的形象化展示。

所以面对上述的表达式子,依然可以任意把玩。式子两边同时除以 w w w www www
f ( w ) w = d f ( w ) d w f ( w ) w = d f ( w ) d w w f ( w ) ​ = d w d f ( w ) ​ f(w)w=df(w)dw\dfrac{f(w)}{w}=\dfrac{d f(w)}{dw}wf(w)​=dwdf(w)​ f(w)w=df(w)dwwf(w)=dwdf(w)wf(w)=dwdf(w)

看看左边右边分别是什么?

  • 左边: f ( w ) f ( w ) f ( w ) f(w)f(w)f(w) f(w)f(w)f(w)上任意一点到原点的直线的斜率;
  • 右边:曲线 f ( w ) f ( w ) f ( w ) f(w)f(w)f(w) f(w)f(w)f(w)上任意一点切线的斜率。

两个斜率一致的时候, w w w www www取值计算的 E E E EEE EEE是最优的,即 曲线 f ( w ) f ( w ) f ( w ) f(w)f(w)f(w) f(w)f(w)f(w)上任意一点 P P P PPP PPP和原点之间的直线与该点的切线共线! 的时候,该点 P P P PPP PPP w w w www www t t t ttt ttt的取值为最优!

形象地看,我们可以通过 操作 来获取最优的点,即:
从经过原点的t=0这条直线开始,任其绕着原点逆时针旋转,第一次切到曲线 f ( w ) f ( w ) f ( w ) f(w)f(w)f(w) f(w)f(w)f(w)的那个点,就是最优点。

很简单,是吧。


现在已经定性地把问题解决了,无论曲线 t = f ( w ) t = f ( w ) t = f ( w ) t=f(w)t=f(w)t=f(w) t=f(w)t=f(w)t=f(w)长什么样子,我们可以从上述的操作步骤中获取最优的 P P P PPP PPP点,进而求出Inflight值,最终确定Cwnd。

然而,这并不能定量地分析,如果要定量地分析,则必须要有 t = f ( w ) t = f ( w ) t = f ( w ) t=f(w)t=f(w)t=f(w) t=f(w)t=f(w)t=f(w)的表达式。

这个表达式何来?我花了好长时间也没有思路。


再仔细看看带宽和RTT之间的关系,在固定的带宽下,RTT受到Inflight的影响,然而Inflight正是我们要求解的,这貌似进入了一个循环,消除Inflight变量并无法确定二者的关系,这便是陷入了两难!

我略过了好多文字,这些文字描述了大概将近一个月的见闻,然后我就想到了 排队论排队论排队论排队论排队论


排队论基于概率理论给出精确的逗留时长和到达率以及服务率之间的关系。

排队论是一个复杂的理论,能写几大部头都写不完,我自己也只是略懂一二,并不是专门研究这个的,所以本着解决手头当前问题的广度优先原则,下面我依据排队论的一些结论性的公式进行推导,关于这个公式的推导,我会在本文后面给出一个附录。

我们依然根据最简单的情况建立模型,即经典的M/M/1排队模型下的场景,在该场景下,先设以下的变量:

  • 到达率: λ λ λ λ\lambdaλ λλλ
  • 服务率: μ μ μ μ\muμ μμμ
  • 系统负荷水平: ρ ρ ρ ρ\rhoρ ρρρ
  • 用户停留时间: W s W s W s ​ WsW_sWs​ WsWsWs

然后,有一些用到的定义以及公式,我们根据这些公式来进行后续的关于BBR最优化的证明。需要声明的是,M/M/1排队模型是一个简化的模型,并不代表现网中运行BBR算法的TCP传输发包特征就一定符合这个模型,但这是一个很好的开始。

这些结论性的定义和公式如下:

  • 系统负荷水平
    ρ = λ μ ρ = λ μ ρ = μ λ ​ ρ=λμ\rho=\dfrac{\lambda}{\mu}ρ=μλ​ ρ=λμρ=μλρ=μλ
  • 用户停留时间(包括排队时间和被服务的时间)
    W s = 1 μ − λ W s = 1 μ − λ W s ​ = μ − λ 1 ​ Ws=1μ−λW_s=\dfrac{1}{\mu-\lambda}Ws​=μ−λ1​ Ws=1μλWs=μλ1Ws=μλ1
  • 当前系统中用户数(包括排队的和正在被服务的)
    L s = λ μ − λ L s = λ μ − λ L s ​ = μ − λ λ ​ Ls=λμ−λL_s=\dfrac{\lambda}{\mu-\lambda}Ls​=μ−λλ​ Ls=λμλLs=μλλLs=μλλ
  • 排队等待时间
    W g = λ μ × ( μ − λ ) W g = λ μ × ( μ − λ ) W g ​ = μ × ( μ − λ ) λ ​ Wg=λμ×(μ−λ)W_g=\dfrac{\lambda}{\mu \times (\mu-\lambda)}Wg​=μ×(μ−λ)λ​ Wg=λμ×(μλ)Wg=μ×(μλ)λWg=μ×(μλ)λ

有了这些,便可以建立BBR的模型了。

在一个带宽固定的网络中,我们假设带宽为 C C C CCC CCC(基于这种固定带宽的假设,实际上这是M/D/1排队模型,但是推导过程并无伤大雅!),而我们发送的带宽可以理解为 到达率, 即 λ λ λ λ\lambdaλ λλλ,此时我们可以把 W s W s W s ​ WsW_sWs​ WsWsWs等效于RTT,因此RTT和带宽的关系则为:

R T T = f ( λ ) = W s = 1 μ − λ = 1 C − λ R T T = f ( λ ) = W s = 1 μ − λ = 1 C − λ R T T = f ( λ ) = W s ​ = μ − λ 1 ​ = C − λ 1 ​ RTT=f(λ)=Ws=1μ−λ=1C−λRTT=f(\lambda)=W_s=\dfrac{1}{\mu-\lambda}=\dfrac{1}{C-\lambda}RTT=f(λ)=Ws​=μ−λ1​=C−λ1​ RTT=f(λ)=Ws=1μλ=1CλRTT=f(λ)=Ws=μλ1=Cλ1RTT=f(λ)=Ws=μλ1=Cλ1

根据我们上面的那个最优解公式:

f ( λ ) = λ × d f ( λ ) d λ f ( λ ) = λ × d f ( λ ) d λ f ( λ ) = λ × d λ d f ( λ ) ​ f(λ)=λ×df(λ)dλf(\lambda)=\lambda \times \dfrac{d f(\lambda)}{d \lambda}f(λ)=λ×dλdf(λ)​ f(λ)=λ×df(λ)dλf(λ)=λ×dλdf(λ)f(λ)=λ×dλdf(λ)

带入则有:

f ( λ ) = λ × d f ( λ ) d λ = 1 C − λ f ( λ ) = λ × d f ( λ ) d λ = 1 C − λ f ( λ ) = λ × d λ d f ( λ ) ​ = C − λ 1 ​ f(λ)=λ×df(λ)dλ=1C−λf(\lambda)=\lambda\times \dfrac{d f(\lambda)}{d \lambda}=\dfrac{1}{C-\lambda}f(λ)=λ×dλdf(λ)​=C−λ1​ f(λ)=λ×df(λ)dλ=1Cλf(λ)=λ×dλdf(λ)=Cλ1f(λ)=λ×dλdf(λ)=Cλ1

而这里的 d f ( λ ) d λ d f ( λ ) d λ d λ d f ( λ ) ​ df(λ)dλ\dfrac{d f(\lambda)}{d\lambda}dλdf(λ)​ df(λ)dλdλdf(λ)dλdf(λ)则可以对 f ( λ ) f ( λ ) f ( λ ) f(λ)f(\lambda)f(λ) f(λ)f(λ)f(λ)简单求导:

d f ( λ ) d λ = 1 ( C − λ ) 2 d f ( λ ) d λ = 1 ( C − λ ) 2 d λ d f ( λ ) ​ = ( C df(λ)dλ=1(C−λ)2\dfrac{d f(\lambda)}{d\lambda}=\dfrac{1}{(C-\lambda)^2}dλdf(λ)​=(C df(λ)dλ=1(Cλ)2dλdf(λ)=(Cλ)21dλdf(λ)=(C

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值