TCP Vegas 收敛性与吞吐

Posted dog250

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP Vegas 收敛性与吞吐相关的知识,希望对你有一定的参考价值。

昨天下班路上发个朋友圈:

TCP Vegas 算法作为一个 Delay-based 算法,与 Loss-based 算法的处理完全不同。由于 Delay 并非明确信号,无法找到触发 AIMD 的时机。Vegas 采用 AIAD。

Vegas 思想相当极简:

  • 当排队尚未严重到一定程度,AI 递增 cwnd。
  • 当排队严重到一定程度,AD 递减 cwnd。

论文:https://cseweb.ucsd.edu/classes/wi01/cse222/papers/brakmo-vegas-jsac95.pdf

AIAD 是不收敛的,Vegas 为何收敛呢?关键在于 “一定程度”,这 “排队到一定程度” 并非固定事件,它随 Buffer 的使用及多条流分别占用 Buffer 的比例而变化。

本文先证明 Vegas 收敛性,再针对 Linux Vegas 实现做一个优化,斧正由于 Linux 内核拥塞状态机框架的局限而导致的带宽利用率损失。

先看收敛性。

设流 i 窗口为 Wi,带宽为 bi,固定传播时延 r,队列中的数据量为 Bi,排队时延 Di,则:

W i = B i + b i ∗ r W_i=B_i+b_i∗r Wi=Bi+bir

b i = W i R i = W i D i + r b_i=\\dfracW_iR_i=\\dfracW_iD_i+r bi=RiWi=Di+rWi

现推导两条流的收敛情况。由于共享 Buffer,两条流的排队时延是相同的,设 D = Di,则:

b i = W i D + r b_i=\\dfracW_iD+r bi=D+rWi

此外,两条流共享带宽,且带宽利用率 100%,设总带宽为 1,则:

b 1 + b 2 = W 1 D + r + W 2 D + r = 1 b_1+b_2=\\dfracW_1D+r+\\dfracW_2D+r=1 b1+b2=D+rW1+D+rW2=1

给定任意 W1 和 W2,均可求的 b1,b2,进而求得 B1,B2。
把满足以下条件的所有点 P(W1, W2)描成线:
L1: α = B 1 \\alpha=B_1 α=B1
L2: β = B 1 \\beta=B_1 β=B1
L3: α = B 2 \\alpha=B_2 α=B2
L4: β = B 2 \\beta=B_2 β=B2

即下图:

下面看为什么 L1~L4 是双曲线形式。
通过 Vegas 稳定条件 α ≤ D i f f = W ∗ ( R r − 1 ) ≤ β \\alpha\\le Diff=W*(\\dfracRr-1)\\le\\beta αDiff=W(rR1)β 构造等式:

α = W ∗ ( R r − 1 ) \\alpha=W*(\\dfracRr-1) α=W(rR1)

可得:

W = α ∗ r R − r W=\\alpha * \\dfracrR-r W=αRrr

写出 W1 的表达式,并用 W2 的表达式表示 R:

W 1 = α ∗ r W 2 b 2 − r W_1=\\alpha * \\dfracr\\dfracW2b_2-r W1=αb2W2rr

看一下 W 和 b 的大致关系,如果 W 和 W/b 之间正相关,W1 和 W2 则构成一条大致双曲线,就能看出 L1~L4 就是那个样子。

显然,D 是 W 的增函数: D = f ( W ) D=f(W) D=f(W),根据 b 和 W 的关系 b = W D + r = W f ( W ) + r b=\\dfracWD+r=\\dfracWf(W)+r b=D+rW=f(W)+rW,两边同时除以 b:

W b = f ( W ) + r \\dfracWb=f(W)+r bW=f(W)+r

可见,W 和 W/b 正相关(另一种解释是,W 占比越大,b 的加速比越小)。于是 W 1 = F ( W 2 ) W_1=F(W_2) W1=F(W2) 大致就是一条双曲线。

最终,很显然,对于流 1,Vegas 的稳定状态要求 W1 在 L1 和 L2 之间,对于流 2,Vegas 的稳定状态要求 W2 在 L3 和 L4 之间,图中 1 和 2 的区域即收敛区域。

这个区域围绕在公平线两边,说明 Vegas 是收敛的。

这张图的结论如下:

  • 带宽利用率 100%。
  • 稳定收敛到公平。

看起来不错,高效又公平,剩下的工作就是在各种场景下调参,找到最优的 α , β 。

这意味着 Vegas 不需要 AIMD。但对于 Linux Vegas 实现,在 4.9 内核前,却避不开 AIMD。

Linux 4.9 之前,TCP 内置的拥塞状态机对拥塞控制算法的假设是 Loss-based,在 Recovery 状态,prr 算法无条件将 cwnd 退避到 ssthresh。

直到 BBR 引入 cong_control 回调完全接管拥塞状态机,一切才高尚。既然 Delay-based Vegas 已经自行完成了收敛,AIMD 岂不多余?

Delay-based Vegas 既然用 Delay 变化控制拥塞,理想情况下即无拥塞,否则 Vegas 即失效,因此,丢包一定不是拥塞导致,执行守恒足够了。

改个移除 AIMD 的版本:
https://github.com/marywangran/tcp-vegas-plus

这是一个朴素的 Vegas,但真实。核心有三个:

  • cong_control 全权接管拥塞状态机处理。
  • RTO 后需 reset 掉 minRTT。RTO 需很久,Fast Retransmit 和 TLP Retransmit 均未触发,可能遭遇了路由重收敛。
  • 发生丢包时,在 Recovery 阶段执行数据包守恒。

跟我上周的 caohejing 算法类似,caohejing 算法也一样需要调参,比如 5% 增益和减损阈值。不同的是 caohejing 算法是 Rate-based,丢包会反馈在 Delivery rate ,自动收敛。Vegas 还是 ACK 驱动,Recovery 状态需主动执行守恒。

Delay-based Vegas 的 AIAD 可以收敛吗?可以。Vegas 需要丢包时 MD 吗?不需要。为什么代码里看起来需要 MD 呢?因为 Linux TCP 拥塞控制框架的局限,以及实现者趋向保守。那么 Vegas 面临丢包时需要如何做呢?执行数据包守恒即可。 这鞋子能跳舞吗?呱唧,呱唧,啪!不一般,我喜欢,日泰皮鞋!

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

以上是关于TCP Vegas 收敛性与吞吐的主要内容,如果未能解决你的问题,请参考以下文章

QVegas-一个升级版的TCP Vegas拥塞算法

Loadrunner参数(摘)

loss曲线不收敛

工科数学分析基础的目录

BBR 与拉弗曲线收敛点

loadrunner检测Windows资源计数器要求