自从上周有个大半夜帮温州皮鞋厂老板计算了那个2ln22ln2之后,就着这个问题又进行了一些思考,过程中非常感谢BBR的作者之一Neal Cardwell,帮忙解释了很多的细节并同时放出了关于BBR Startup gain的最新模型,看这里:
https://github.com/google/bbr/tree/master/Documentation/startup/gain/analysis
其中的bbr_startup_gain.pdf中给出了bbr_high_gain的另一个值2.77,该文档通篇通过一个简易的数学模型解释了这个2.77是怎么算出来的,推导过程和我的TCP BBR的startup bbr_high_gain为什么是2/ln2?这篇文章的推导过程非常类似,细节我这里最多无非也就翻译一遍,就不浪费篇幅了。
本文我来基于我的TCP BBR的startup bbr_high_gain为什么是2/ln2?这篇文章给出另一个不同的推导过程,最终无论是2ln2≈2.892ln2≈2.89还是4ln2≈2.774ln2≈2.77都可以统一到同一个模型中来。
我们依然用下面的函数分别代表PacingRatePacingRate和cwndcwnd:
f1(x)=2xf1(x)=2x
f2(x)=2xf2(x)=2x
PacingRatePacingRate的计算方法在下面的链接可以找到:
Delivery Rate Estimation:https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00
send_elapsed = (P.sent_time - P.first_sent_time) send_rate = data_acked / send_elapsed12
在Startup阶段,我们可以用RTTRTT来对draft里面的send_elapsed进行归一化处理。所以,假设RTTRTT为11去归一化,这样我们就可以直接用cwndcwnd来表示PacingRatePacingRate了。
有了上述的假设,我们再看一下2ln2≈2.892ln2≈2.89是怎么推导出来的,请看下图:
这样我们可以导出:
G=2ln2≈2.885G=2ln2≈2.885
其实,从图上看,显然还有另外一种拟合的方式,非常简单和对称:
我们看一下推导过程:
last_cwnd=∫x−1x−22xdx=2x4ln2last_cwnd=∫x−2x−12xdx=2x4ln2
next_cwnd=2xnext_cwnd=2x
根据图示上的关系G×last_cwnd=next_cwndG×last_cwnd=next_cwnd,我们有:
G×2x4ln2=2xG×2x4ln2=2x
所以,最终可以导出:
G=4ln2≈2.773G=4ln2≈2.773
这样在同一个模型里,我们发现两个GG值都是正确的,最终全部拟合了PacingRatePacingRate和cwndcwnd每RTTRTT增倍的平滑曲线,两种方式的不同点主要体现在那个定积分代表的连续拟合到底是起点还是终点:
如果定积分作为终点,那么就是离散向连续拟合;
如果定积分作为起点,那么就是连续向离散拟合。
最终到底选择哪个GG值作为gain,正如作者Neal Cardwell所说,除了理想化的模型之外,还需要真实网络环境中的数据支撑,因此,并不确定gain的最终值。
事实上,最大的问题在于,如何确定初始PacingRatePacingRate,这个值目前显然更多的是拍脑袋的结果,而我们的模型之所以精确是因为计算所用的PacingRatePacingRate真的就是用下面的标准中的方法实测出来的:
Delivery Rate Estimation:https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00
显然,一开始的PacingRatePacingRate并没有实测条件,因此在初始的几个RTTRTT,Startup的表现并非如模型预测的那般精确,这也是不得已的事情。实际上,随着Startup阶段的推进,实际数据和模型的预测将会越来越匹配。
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章