一、摘要
Copa是一种端到端的拥塞控制算法,采用三个idea组合实现。
- 通过优化一个效用函数(与吞吐量和延迟相关),求得其最优速率为 1 / δ d q 1/\delta d_q 1/δdq,将其作为target rate;
- 通过调整拥塞窗口往target rate的方向变化;
这两个idea构成了一个delay-based的CC算法,能够实现高吞吐量低延时的目标。
但是delay-based的CC算法有一个通病,就是——与loss-based的CC算法竞争时,争抢不到带宽。第三个idea:
- 通过delay的变化,探测是否存在buffer-fillers(使buffer占满的CC算法),以加性增/乘性减的方式调整 δ \delta δ参数。
二、背景
拥塞控制(CC)算法的发展可以分为三个阶段:
- 从Reno开始,扩展到Cubic、Compound算法,以丢包、ECN作为拥塞信号;——缺点:这些算法都倾向于填满buffer,即以delay的代价来实现高吞吐量。
- 基于delay的CC算法,E.g. Vegas、FAST。这些算法可以带来低延迟;——缺点:由于ACK压缩(SACK)、网络抖动,导致高估延迟,而这些算法又以delay作为拥塞信号,因此链路带宽无法完全利用;另一个缺点:无法与loss-based的CC算法竞争。
- 最近的研究多关注特定环境和工作负载下的CC算法,使CC算法变得特异性,而不是普遍性。这些算法在特定场景的效果优于先前具有普遍性的算法。
本文目标:
实现一个高吞吐、低排队延迟、公平分配、简单且易于理解、并且具备普遍性的CC算法,在性能上优于先前的算法。
三、Copa基本思路
Copa定义了一个效用函数:
U
=
l
o
g
λ
−
δ
⋅
l
o
g
d
U=log\ \lambda - \delta \cdot log\ d
U=log λ−δ⋅log d
λ
\lambda
λ是平均吞吐量;
δ
\delta
δ是衡量delay的权重;
d
d
d是包延迟。
稳态速率是:
λ
=
1
δ
⋅
d
q
\lambda = \frac{1}{\delta \cdot d_q}
λ=δ⋅dq1
即
T
a
r
g
e
t
R
a
t
e
Target\ Rate
Target Rate。拥塞控制策略即使发送速率往
T
a
r
g
e
t
R
a
t
e
Target\ Rate
Target Rate靠近。
在只有Copa存在时,使用基于delay的方法是好的;而在有loss-based的流竞争时,降低delay的权重,保证基于delay的算法不会饿死。
结合各自的优点:
即可得到:
即使用第三个idea来应对loss-based算法竞争带宽的问题。
Copa基本的控制思路如上,具体的讨论和细节见下面的章节。
四、Copa在每个ACK到达时的操作
-
更新排队延迟 d q d_q dq和srtt——使用标准的TCP指数移动平均估计。
d q = R T T s t a n d i n g − R T T m i n d_q=RTTstanding-RTTmin dq=RTTstanding−RTTmin -
设置target rate
λ t = 1 / δ ⋅ d q \lambda_t=1/\delta \cdot d_q λt=1/δ⋅dq -
如果当前的发送速率 λ = c w n d / R T T s t a n d i n g ≤ λ t \lambda=cwnd/RTTstanding \leq \lambda_t λ=cwnd/RTTstanding≤λt,则有:
c w n d = c w n d + v / ( δ ⋅ d q ) cwnd=cwnd+v/(\delta \cdot d_q) cwnd=cwnd+v/(δ⋅dq)
其中, v v v是速率。
否则:
c w n d = c w n d − v / ( δ ⋅ d q ) cwnd=cwnd-v/(\delta \cdot d_q) cwnd=cwnd−v/(δ⋅dq)
即加性增加性减AIAD。
-
速率 v v v是用来加速收敛的,初始值为1。
如果当前窗口cwnd大于上一个ACK的数据包发送时的窗口cwnd,则方向 d i r e c t i o n direction direction设置为up;否则,为down。
如果当前方向与上次一样,则v将double,即 v = 2 ⋅ v v=2\cdot v v=2⋅v。否则,重置v为1。
值得注意的是,最开始的double v,需要方向持续3个RTT以上。因为,方向在稳态下,可能保持2.5个RTT不变。
上图为在一个Copa周期内队列延时随时间的变化。
首先为什么平衡的时候,队列长度为
δ
−
1
\delta^{-1}
δ−1个数据包?
当平衡的时候有:
当前速率等于目标速率,即
λ
t
=
1
/
(
δ
d
q
)
=
c
w
n
d
/
R
T
T
s
t
a
n
d
i
n
g
\lambda_t=1/(\delta d_q)=cwnd/RTT_{standing}
λt=1/(δdq)=cwnd/RTTstanding
d
q
=
R
T
T
s
t
a
n
d
i
n
g
−
R
T
T
M
i
n
d_q=RTT_{standing}-RTT_{Min}
dq=RTTstanding−RTTMin
即有:
c
w
n
d
⋅
R
T
T
s
t
a
n
d
i
n
g
−
R
T
T
M
i
n
R
T
T
s
t
a
n
d
i
n
g
=
1
δ
cwnd\cdot \frac{RTT_{standing}-RTT_{Min}}{RTT_{standing}}=\frac{1}{\delta}
cwnd⋅RTTstandingRTTstanding−RTTMin=δ1。
即cwnd中在排队的数据包为
δ
−
1
\delta^{-1}
δ−1。
对该图的解读:
在Change Point A时,Copa收到ACK,并将当前的发送速率
λ
\lambda
λ与目标速率
λ
t
\lambda_t
λt对比,这需要1个RTT的反馈延迟。而如果要检测出方向改变,则需要减少cwnd,即在第3 步要实现
λ
>
λ
t
\lambda > \lambda_t
λ>λt。而
λ
=
c
w
n
d
/
R
T
T
s
t
a
n
d
i
n
g
\lambda = cwnd/RTT_{standing}
λ=cwnd/RTTstanding,
λ
t
=
1
/
(
δ
⋅
d
q
)
\lambda_t = 1/(\delta \cdot d_q)
λt=1/(δ⋅dq),即当
R
T
T
s
t
a
n
d
i
n
g
RTT_{standing}
RTTstanding从稳态开始变大时,
d
q
d_q
dq增大,
λ
t
\lambda_t
λt减小,即此时
λ
>
λ
t
\lambda > \lambda_t
λ>λt,cwnd开始减少,direction改变。
五、第三个idea:与Buffer-filler竞争
设置Copa的两种操作模型:
- 默认模型: δ = 0.5 \delta=0.5 δ=0.5;
- 竞争模型:动态调整 δ \delta δ。
Copa会检测是否有buffer-filler竞争,来决定使用哪个模型。
性质:每5个RTT会排空队列一次。
因此,当Copa检测到接近于空队列的RTT,则使用默认模型;否则,使用竞争模型。
在竞争模型中,使用AIMD的策略调整
δ
\delta
δ,因此,
δ
≤
0.5
\delta \leq0.5
δ≤0.5。
六、Target Rate的推导
本文将数据包的到达分布建模为泊松分布——在流更多的情况下,更贴近真实情况。
随机到达(泊松分布)带来的一个性质:尽管在链路未完全利用时,也可能形成队列。
Utility函数:
U
i
=
log
λ
i
−
δ
i
log
d
s
U_{i}=\log \lambda_{i}-\delta_{i} \log d_{s}
Ui=logλi−δilogds
引理1
Consider a network with n flows, with flow i sending packets with rate λ i \lambda_i λi such that the arrival at the bottleneck queue is Markovian. Then, if flow i has the objective function defined by Eq. (3)(即上面的式子), and the bottleneck is an M/M/1 queue, a unique Nash equilibrium exists.
并且,在均衡时,对于每个发送端 i i i有:
λ i = μ δ i ( δ ^ − 1 + 1 ) \lambda_{i}=\frac{\mu}{\delta_{i}\left(\hat{\delta}^{-1}+1\right)} λi=δi(δ^−1+1)μ
其中, δ ^ = ( ∑ 1 / δ i ) − 1 \hat{\delta}=\left(\sum 1 / \delta_{i}\right)^{-1} δ^=(∑1/δi)−1。
证明:
定义总到达速率为:
λ
=
∑
j
λ
j
\lambda = \sum_{j} \lambda_{j}
λ=∑jλj。
假设数据包到达模型为排队论中的M/M/1模型,则平均排队之和为
1
μ
−
λ
\frac{1}{\mu-\lambda}
μ−λ1。
代入效用函数的式子,有:
U
i
=
log
λ
i
+
δ
i
log
(
μ
−
λ
i
−
∑
j
≠
i
λ
j
)
U_{i}=\log \lambda_{i}+\delta_{i} \log \left(\mu-\lambda_{i}-\sum_{j \neq i} \lambda_{j}\right)
Ui=logλi+δilog⎝⎛μ−λi−j=i∑λj⎠⎞
令一阶偏导为0,有:
δ
i
λ
i
+
∑
j
λ
j
=
μ
\delta_{i} \lambda_{i}+\sum_{j} \lambda_{j}=\mu
δiλi+j∑λj=μ
二阶导数为:
−
1
/
λ
i
2
−
δ
i
/
(
μ
−
λ
)
2
<
0
-1 / \lambda_{i}^{2}-\delta_{i} /(\mu-\lambda)^{2}<0
−1/λi2−δi/(μ−λ)2<0
则有下式满足:
λ
i
(
1
+
δ
i
)
+
∑
j
≠
i
λ
j
=
μ
\lambda_{i}\left(1+\delta_{i}\right)+\sum_{j \neq i} \lambda_{j}=\mu
λi(1+δi)+j=i∑λj=μ
这是一个n维线性方程组。
求解得到:
λ
i
=
μ
δ
i
(
δ
^
−
1
+
1
)
\lambda_{i}=\frac{\mu}{\delta_{i}\left(\hat{\delta}^{-1}+1\right)}
λi=δi(δ^−1+1)μ
当服务过程是确定的时,为M/D/1模型,排队时间为:
1
/
(
2
(
μ
−
λ
)
)
−
μ
/
2
≈
1
/
(
2
μ
−
λ
)
1 /(2(\mu-\lambda))-\mu / 2 \approx1 /(2\mu-\lambda)
1/(2(μ−λ))−μ/2≈1/(2μ−λ)
此时均衡速率为:
λ
i
=
2
μ
/
(
δ
i
(
2
δ
^
−
1
+
1
)
)
\lambda_{i}=2 \mu /\left(\delta_{i}\left(2 \hat{\delta}^{-1}+1\right)\right)
λi=2μ/(δi(2δ^−1+1))
这两个速率的区别只有一个因子2,即将
δ
/
2
\delta/2
δ/2。
七、Copa的更新规则
在上一段求得的结果,与最终结果还是有点差距。这段将推一下这两个的关系。
- λ i = μ δ i ( δ ^ − 1 + 1 ) \lambda_{i}=\frac{\mu}{\delta_{i}\left(\hat{\delta}^{-1}+1\right)} λi=δi(δ^−1+1)μ
- λ = 1 δ ⋅ d q \lambda = \frac{1}{\delta \cdot d_q} λ=δ⋅dq1
首先,由第一个式子,对i进行累加,有:
λ
=
∑
j
λ
j
=
μ
⋅
δ
^
−
1
/
(
δ
^
−
1
+
1
)
=
μ
/
(
1
+
δ
^
)
\lambda = \sum_{j} \lambda_{j}=\mu \cdot \hat{\delta}^{-1}/(\hat{\delta}^{-1}+1)=\mu /(1+\hat{\delta})
λ=j∑λj=μ⋅δ^−1/(δ^−1+1)=μ/(1+δ^)
而
d
s
=
1
μ
−
λ
d_s=\frac{1}{\mu-\lambda}
ds=μ−λ1,将上式代入,有:
d
s
=
δ
^
−
1
+
1
μ
d_s=\frac{\hat{\delta}^{-1}+1}{\mu}
ds=μδ^−1+1
因此,
λ
i
=
1
δ
i
⋅
d
s
\lambda_{i}=\frac{1}{\delta_{i} \cdot d_s}
λi=δi⋅ds1
同时,处于均衡时的排队队列中的包个数为:
1
+
1
/
δ
^
1+1/\hat{\delta}
1+1/δ^
这可以通过排队时间
d
s
⋅
d_s\cdot
ds⋅链路速率
μ
\mu
μ(单位是pkts)得到。
即:
μ
μ
−
λ
\frac{\mu}{\mu-\lambda}
μ−λμ
当只有一个用户时,队列包个数为
1
+
δ
−
1
1+\delta^{-1}
1+δ−1,与之前的
δ
−
1
\delta^{-1}
δ−1不同,这是因为后面定义的
d
s
d_s
ds的区别,回忆一下,
d
s
=
d
q
+
1
/
μ
d_s=d_q+1/\mu
ds=dq+1/μ。
而在
d
s
⋅
μ
d_s\cdot \mu
ds⋅μ后,就变成了
d
q
⋅
μ
+
1
d_q\cdot \mu+1
dq⋅μ+1。多出的1就在这。
但为什么要定义
d
s
d_s
ds仍然不懂,这个switch delay是什么情况,有什么物理意义吗?
一个比较有趣的理解:
注意到下面两条公式:
λ
i
=
μ
δ
i
(
δ
^
−
1
+
1
)
\lambda_{i}=\frac{\mu}{\delta_{i}\left(\hat{\delta}^{-1}+1\right)}
λi=δi(δ^−1+1)μ
λ
=
∑
j
λ
j
=
μ
/
(
1
+
δ
^
)
\lambda = \sum_{j} \lambda_{j}=\mu /(1+\hat{\delta})
λ=j∑λj=μ/(1+δ^)
当
δ
i
\delta_i
δi都等于
δ
\delta
δ时,有:
δ
^
−
1
=
δ
n
\hat{\delta}^{-1}=\frac{\delta}{n}
δ^−1=nδ
λ
i
=
μ
/
(
n
+
δ
)
\lambda_i=\mu/(n+\delta)
λi=μ/(n+δ)
相当于链路速率被分给
n
n
n个发送端和
δ
\delta
δ个伪发送端。
八、一点小结果
Copa在和Cubic竞争时,不损害Cubic的性能,自己也保持高性能,甚至利用了Cubic没用到的带宽。