一旦涉及到网络传输的统计规律,很多人就觉得偏离了确定性,试图用精确替换统计,但这是错误的。网络是统计的而不是确定的,本质上是信息量的上限决定的,而信息量的度量则是统计矩(各阶矩为 000 就是确定性)。
出差时发过一则朋友圈:
网络传输优化,可能还是很多人不理解降低各阶矩意味着什么,既然不懂,我也不科普了,直接说结论,后续我会有文章给出细节:
- 理论上(仅仅是理论,这是现网数据前提)M/G/1 模型,方差和排队均值成正比,方差的增大意味着数据包到达的时间局部性被破坏,原本连续数据包,必须等待长尾包,为 TCP 保序,接收端必须增加缓冲,直接导致吞吐量下降;
- 高阶矩偏度峰度调整,AIMD 对尾部时延非常敏感,最终导致非线性惩罚;
- 理论模型,δ 时延分布均值方差超过了缓冲区导致溢出,就会触发协议的一系列动作,损耗的是什么;
- 总而言之,二阶矩,高阶矩,极值分布偏移主导了聚合路径;
其实我说的是多路径聚合,比如具体的 MPTCP\text{MPTCP}MPTCP。
多次有人不厌其烦地问为什么时延异构会降低带宽聚合的叠加效率,我也多次说这是个数学问题,而大部分不做理论研究和技术研发的人是根本不懂数学的,我也就只说一句 "你们不必关注原因,看结果" 就对付了。
但我觉得还是要解释一通,留下点纸面的东西,正好有 AI\text{AI}AI 辅助,我也不用靠搜索引擎查那些繁琐的数学公式了,很快就能把思路顺成一篇说明文,就是本文。
裤衩子锁着边儿,而且绣着花儿。
完美调度
先确立一个基准,在每条路径的时延完全恒定且可精确可预知时,启用完美调度算法。
设 NNN 条路径,路径 iii 的恒定时延为 did_idi,容量为 CiC_iCi,发送端要将包序列 1,2,3,...1,2,3,\dots1,2,3,... 按目标速率 λ\lambdaλ 调度到各路径,使接收端严格保序、等间隔到达。
对任意分配到路径 iii 的包 nnn,发送端只需将其发送时刻设为:
tn∗=nλ−dit_n^* = \dfrac{n}{\lambda} - d_itn∗=λn−di
则到达时刻 An=tn∗+di=nλA_n = t_n^* + d_i = \dfrac{n}{\lambda}An=tn∗+di=λn,所有包等间隔保序到达。接收端无需任何乱序缓冲区,发送端也无需插入保护间隔。
以上也是 MPTCPv1\text{MPTCPv1}MPTCPv1 默认的调度算法。
理论上,调度是完美的:
- 零乱序,到达间隔恒为 1λ\dfrac{1}{\lambda}λ1,P(In<0)=0P(I_n<0)=0P(In<0)=0;
- 零重排序队列,接收端缓冲区占用恒为 000;
- 聚合效率 100%100\%100%,η=Tactual∑Ci=1\eta = \dfrac{T_{\text{actual}}}{\sum C_i} = 1η=∑CiTactual=1,带宽完全叠加;
- 时延差无关,无关 Δd=maxdi−mindi\Delta d = \max d_i - \min d_iΔd=maxdi−mindi,只要恒定,就能抵消;
唯一代价是发送窗口扩张,慢路径必须提前 Δd\Delta dΔd 发送,inflight\text{inflight}inflight 额外增加 λΔd\lambda\Delta dλΔd,但在不限制发送缓冲和拥塞窗口假设下,不影响聚合吞吐效率。
完美调度的核心:
- 时延差本身不是问题,时延不确定性才是。只要预测零误差,任意大的时延差都能被精确补偿。所有效率损失,都源于实际时延的抖动导致预测存在误差,使完美调度的前提被破坏。
模型与误差结构
发送端维护每条路径的时延预测 μ^i\hat{\mu}_iμ^i,按预测调度使包等间隔到达:
tn∗=nλ−μ^i(n)t_n^* = \dfrac{n}{\lambda} - \hat{\mu}_{i(n)}tn∗=λn−μ^i(n)
若预测完全准确,到达完美保序,效率为 100%100\%100%,即完美调度。实际时延 Di(t)=μi+Xi(t)D_i(t)=\mu_i+X_i(t)Di(t)=μi+Xi(t),预测值为提前 τi\tau_iτi 时间的估计 μ^i(t−τi)\hat{\mu}_i(t-\tau_i)μ^i(t−τi),预测误差:
ϵi(t)=Di(t)−μ^i(t−τi)\epsilon_i(t) = D_i(t) - \hat{\mu}_i(t-\tau_i)ϵi(t)=Di(t)−μ^i(t−τi)
实际到达时刻 An=nλ+ϵi(n)A_n = \dfrac{n}{\lambda}+\epsilon_{i(n)}An=λn+ϵi(n),效率损失的全部来源是预测误差 ϵi\epsilon_iϵi 的统计特性。
一阶矩:时延差放大预测误差
慢路径必须更早发送,其预测提前量 τi=μ^i−minjμ^j∈0,Δμ\tau_i = \hat{\mu}_i - \min_j\hat{\mu}_j \in 0,\\Delta\\muτi=μ^i−minjμ^j∈0,Δμ,直接由时延差 Δμ\Delta\muΔμ 决定。
设时延过程自相关函数为 ρi(τ)\rho_i(\tau)ρi(τ),最优线性预测的误差方差:
Var(ϵi)=σi21−ρi2(τi)\text{Var}(\epsilon_i) = \sigma_i^2\left1-\\rho_i\^2(\\tau_i)\\rightVar(ϵi)=σi21−ρi2(τi)
由于 ρi(τ)\rho_i(\tau)ρi(τ) 单调递减,τi\tau_iτi 越大则 ρi\rho_iρi 越小,预测误差方差越大:
Δμ↑ ⇒ τi↑ ⇒ ρi(τi)↓ ⇒ Var(ϵi)↑\Delta\mu \uparrow \;\Rightarrow\; \tau_i \uparrow \;\Rightarrow\; \rho_i(\tau_i) \downarrow \;\Rightarrow\; \text{Var}(\epsilon_i) \uparrowΔμ↑⇒τi↑⇒ρi(τi)↓⇒Var(ϵi)↑
长时延路径通常经过更多跳数,固有抖动与均值正相关 σi=αμiβ\sigma_i=\alpha\mu_i^\betaσi=αμiβ,β∈0.5,1\beta\in0.5,1β∈0.5,1,慢路径本身的 σi\sigma_iσi 更大,进一步叠加。
时延差越大,慢路径预测越接近猜,预测误差方差从 σ2(1−ρ2)\sigma^2(1-\rho^2)σ2(1−ρ2) 趋近于 σ2\sigma^2σ2 上限,完美调度中被精确抵消的时延差,在抖动存在时转化为预测误差的放大器。
二阶矩:乱序概率与重排序队列
先看到达间隔方差与乱序概率,相邻包到达间隔:
In=1λ+ϵi(n+1)−ϵi(n)I_n = \dfrac{1}{\lambda} + \epsilon_{i(n+1)} - \epsilon_{i(n)}In=λ1+ϵi(n+1)−ϵi(n)
独立路径下 Var(In)=Var(ϵi(n+1))+Var(ϵi(n))\text{Var}(I_n)=\text{Var}(\epsilon_{i(n+1)})+\text{Var}(\epsilon_{i(n)})Var(In)=Var(ϵi(n+1))+Var(ϵi(n)),周期平均为 2N∑Var(ϵi)\dfrac{2}{N}\sum\text{Var}(\epsilon_i)N2∑Var(ϵi),随 Δμ\Delta\muΔμ 增大。
到达间隔为负即乱序。对高斯误差,路径 i→ji\to ji→j 切换的乱序概率:
preorder=Q(1λσϵ,i2+σϵ,j2)p_{\text{reorder}} = Q\left(\dfrac{\dfrac{1}{\lambda}}{\sqrt{\sigma_{\epsilon,i}^2+\sigma_{\epsilon,j}^2}}\right)preorder=Q σϵ,i2+σϵ,j2 λ1
Δμ\Delta\muΔμ 增大使分母增大,QQQ 自变量减小,乱序概率单调上升。数值上,σϵ\sigma_\epsilonσϵ 从 0.1ms\text{0.1ms}0.1ms 增至 0.5ms\text{0.5ms}0.5ms 时,乱序率从 ∼10−13\sim10^{-13}∼10−13 升至 ∼8%\sim8\%∼8%。
再看乱序队列,稳态乱序队列长度为反射随机游走最大值 Q=maxk≥0(ϵi(n)−ϵi(n−k))+Q=\max_{k\geq0}(\epsilon_{i(n)}-\epsilon_{i(n-k)})^+Q=maxk≥0(ϵi(n)−ϵi(n−k))+。两路径下均值:
EQ=σϵ,12+σϵ,222π\mathbb{E}Q = \dfrac{\sqrt{\sigma_{\epsilon,1}^2+\sigma_{\epsilon,2}^2}}{\sqrt{2\pi}}EQ=2π σϵ,12+σϵ,22
随 σϵ\sigma_\epsilonσϵ 线性增长。完美调度下该值恒为 000。
此外,inflight\text{inflight}inflight 具有扩散效应。路径 iii 在途包数 Ki=λiμiK_i=\lambda_i\mu_iKi=λiμi,其抖动独立,到达时间偏移的极差:
ERi≈2σi2ln(λiμi)\mathbb{E}R_i \approx 2\sigma_i\sqrt{2\ln(\lambda_i\mu_i)}ERi≈2σi2ln(λiμi)
慢路径 μi\mu_iμi 大 → inflight\text{inflight}inflight 多 → 到达时间扩散范围广 → 缓冲区需求大。若 σi=αμi\sigma_i=\alpha\mu_iσi=αμi,则 ERi≈2αμi2ln(λiμi)\mathbb{E}R_i\approx 2\alpha\mu_i\sqrt{2\ln(\lambda_i\mu_i)}ERi≈2αμi2ln(λiμi) ,近线性增长。
高阶矩:极端事件与重尾
偏度即三阶矩,实际时延右偏(γ>0\gamma>0γ>0),慢路径的极端正误差(滞后包)阻塞其后所有快路径包。三阶中心矩:
E(ϵi−ϵj)3=γiσϵ,i3−γjσϵ,j3\mathbb{E}(\\epsilon_i-\\epsilon_j)\^3 = \gamma_i\sigma_{\epsilon,i}^3 - \gamma_j\sigma_{\epsilon,j}^3E(ϵi−ϵj)3=γiσϵ,i3−γjσϵ,j3
慢路径 σϵ,i\sigma_{\epsilon,i}σϵ,i 更大,其三阶绝对矩 γiσϵ,i3\gamma_i\sigma_{\epsilon,i}^3γiσϵ,i3 远大于快路径,使重排序队列尾部,即 Chernoff\text{Chernoff}Chernoff 界衰减更慢,HOL\text{HOL}HOL 阻塞尖峰更频繁。
峰度即四阶矩,高峰度对应重尾时延。四阶中心矩:
E(ϵi−ϵj)4=3(σϵ,i2+σϵ,j2)2+(κi−3)σϵ,i4+(κj−3)σϵ,j4\mathbb{E}(\\epsilon_i-\\epsilon_j)\^4 = 3(\sigma_{\epsilon,i}^2+\sigma_{\epsilon,j}^2)^2 + (\kappa_i-3)\sigma_{\epsilon,i}^4 + (\kappa_j-3)\sigma_{\epsilon,j}^4E(ϵi−ϵj)4=3(σϵ,i2+σϵ,j2)2+(κi−3)σϵ,i4+(κj−3)σϵ,j4
慢路径的 σϵ,i4\sigma_{\epsilon,i}^4σϵ,i4 项随 Δμ\Delta\muΔμ 四次方增长。
幂律尾时 P(Q>q)∼q−(α−1)P(Q>q)\sim q^{-(\alpha-1)}P(Q>q)∼q−(α−1),α≤3\alpha\leq3α≤3 时 EQ2\mathbb{E}Q\^2EQ2 发散,缓冲区再大也无法消除溢出概率。
聚合交付过程的有效带宽展开为各阶矩之和:
eB(θ)=Rˉ+θ2Var(R)+θ26E(R−Rˉ)3+θ324E(R−Rˉ)4+⋯e_B(\theta) = \bar{R} + \dfrac{\theta}{2}\text{Var}(R) + \dfrac{\theta^2}{6}\mathbb{E}(R-\\bar{R})\^3 + \dfrac{\theta^3}{24}\mathbb{E}(R-\\bar{R})\^4 + \cdotseB(θ)=Rˉ+2θVar(R)+6θ2E(R−Rˉ)3+24θ3E(R−Rˉ)4+⋯
Δμ\Delta\muΔμ 增大同时抬高所有阶中心矩,有效带宽升高,固定资源下可达吞吐量下降。完美调度下各阶中心矩均为 000,eB=Rˉe_B=\bar{R}eB=Rˉ,无效率损失。
调度约束
慢路径包提前 Δμ\Delta\muΔμ 发送,额外 inflight\text{inflight}inflight Kextra=λΔμK_{\text{extra}}=\lambda\Delta\muKextra=λΔμ,需要更大的拥塞窗口和缓冲区,丢包恢复环路更长,这是完美调度中唯一存在的代价,但在抖动存在时被进一步放大。
为将乱序率控制在 p0p_0p0 以下,需插入保护间隔:
g≥Q−1(p0)σϵ,i2+σϵ,j2−1λg \geq Q^{-1}(p_0)\sqrt{\sigma_{\epsilon,i}^2+\sigma_{\epsilon,j}^2} - \dfrac{1}{\lambda}g≥Q−1(p0)σϵ,i2+σϵ,j2 −λ1
有效速率 λeff=λ(1+λg)\lambda_{\text{eff}}=\dfrac{\lambda}{(1+\lambda g)}λeff=(1+λg)λ,Δμ\Delta\muΔμ 越大 → σϵ\sigma_\epsilonσϵ 越大 → ggg 越大 → 有效速率越低。这是调度算法主动牺牲速率换保序的代价,而完美调度下 g=0g=0g=0。
统计矩与聚合效率
η=11+λg∗⏟保护间隔损失⋅(1−poverflow)⏟缓冲区溢出损失⋅11+Kextra/Wmax⏟窗口限制损失\eta = \underbrace{\frac{1}{1+\lambda g^*}}{\text{保护间隔损失}} \cdot \underbrace{(1-p{\text{overflow}})}{\text{缓冲区溢出损失}} \cdot \underbrace{\frac{1}{1+K{\text{extra}}/W_{\max}}}_{\text{窗口限制损失}}η=保护间隔损失 1+λg∗1⋅缓冲区溢出损失 (1−poverflow)⋅窗口限制损失 1+Kextra/Wmax1
在预测调度下,效率损失的根源是预测误差被时延差结构性放大,而完美调度证明了时延差本身并非不可逾越:
- 完美调度基准,时延恒定且已知,任意大的时延差都能被精确补偿,效率 100%100\%100%,零乱序,零重排序队列;
- 时延差使慢路径提前更久预测,自相关衰减使预测误差方差趋近 σ2\sigma^2σ2 上限,完美调度精确抵消变为有偏估计;
- 误差方差增大直接抬高乱序概率和乱序队列长度,inflight\text{inflight}inflight 扩散进一步增加缓冲区需求;
- 偏度产生极端滞后包引发 HOL\text{HOL}HOL 尖峰(∼σ3\sim\sigma^3∼σ3),峰度使重尾队列不可被有限缓冲区制约(∼σ4\sim\sigma^4∼σ4);
调度算法只能在牺牲速率和牺牲可靠性之间权衡,无法消除时延差本身带来的信息劣势,这是预测不确定性与保序约束共同决定的极限。
所谓行远多歧,夜长梦多。所以,根源在抖动带来的各路径被放大的各阶统计矩,差别是什么,差别只是一件西装,贾斯特 韦斯特克娄兹。
浙江温州皮鞋湿,下雨进水不会胖。