论文阅读笔记——拥塞控制算法PCC

目录

  • PCC论文阅读笔记
    • TCP为什么这么垃圾
      • 传统TCP是怎么干的
      • 依赖于hardwired mapping会产生什么后果呢?
    • PCC为什么牛逼
      • PCC是怎么干的
        • PCC如何应对噪声?
        • PCC如何取得公平性
        • PCC非常灵活
      • 如何部署PCC
    • FAQ
    • 总结
    • 最后

PCC论文阅读笔记

本文是关于NSDI '15论文《PCC: Re-architecting Congestion Control for Consistent High Performance》的阅读笔记。

TCP为什么这么垃圾

In the roughly 25 years since its deployment, TCP’s congestion control architecture has been notorious for degraded performance. TCP performs poorly on lossy links, penalizes high-RTT flows, underutilizes high bandwidth-delay product (BDP) connections, cannot handle rapidly changing networks, can collapse under data center incast [24] and incurs very high latency with bufferbloat [28] in the network.

TCP真的很垃圾。它无法处理高丢包率链路、无法适用于高RTT的流、无法有效利用高带宽链路、无法处理高度动态变化的网络、在数据中心会出现incast问题、而且也导致Bufferbloat等等。

传统TCP是怎么干的

传统TCP通常依赖于hardwired mapping(这个是什么鬼?见下文)来控制发送速率。但是网络状况实际上是非常复杂的,想要依靠hardwired mapping实现很好的性能是很不实际的。例如,一个简单的丢包,可能是多个流拥塞造成的,也有可能是随机丢包,也有可能运气不好刚好赶上burst造成满队列丢包。

Notehardwired mapping是指提前定义好什么事件触发什么控制动作。如丢包事件触发了AIMD中的MD。

依赖于hardwired mapping会产生什么后果呢?

一个错误的假设会导致灾难性的后果!
举个例子:一个随机丢包,如果判断成拥塞而腰斩发送速率,会极大地降低发送速率。类似地还有很多。

PCC为什么牛逼

PCC不采用hardwired mapping,所以不用对网络进行假设,不用假设丢包到底是什么造成的。

PCC是怎么干的

类似于机器学习,PCC设置一个目标函数,然后不断地尝试各种发送速率,最终使得目标函数达到最优。

例如,一开始,当流的发送速率为r时,它分别以速率(1+ε)r和速率(1-ε)r发送,并观测计算对应的目标函数,并将速率调整为取得较优目标函数的值,并以这个方向继续增大或减小(有点像凸优化中的梯度法),直到该目标函数开始减小。

PCC如何应对噪声?

采用随机控制试验(RCT),这使得PCC能够更鲁棒地对抗噪声。
例如,以随机的顺序进行对2个速率(速率(1+ε)r和速率(1-ε)r)进行4个测试(每个速率2次)。如果在这4个测试中,某个速率的2组测试的目标函数都比较良好,那么选择该速率。若一个好,一个不好,那么维持现有速率不变。
尽管RCT使得PCC的收敛时间变长了,但这是值得的。RCT帮助PCC做出更优的决策,降低了PCC的速率波动。

PCC如何取得公平性

乍一看,PCC是自私的,因为它不会像AIMD那样因为丢包而主动降低自己的速率让别的流通过,它似乎无法取得全局的公平性。然而,通过设置一个合适的目标函数,可以使得多个PCC流都可以公平地共享同一条链路。
(这里有一个问题弄不明白:在这种架构下,各种流如何根据优先级等进行加权平均?是否可以通过设置一个合适的目标函数?还是得中间设备支持?)
例如,通过设置目标函数为
u i ( x i ) = T i ⋅ S i g m o i d α ( L i − 0.05 ) − x i ⋅ L i u_i (x_i) = T_i \cdot Sigmoid_\alpha (L_i - 0.05) - x_i \cdot L_i ui(xi)=TiSigmoidα(Li0.05)xiLi
可以实现多PCC流公平性。其中
S i g m o i d α ( y ) = 1 1 + e α y Sigmoid_\alpha (y) = \frac {1} {1+\mathrm e ^ {\alpha y}} Sigmoidα(y)=1+eαy1
会在y超过0时急速递减至0。该公式将吞吐量乘以一个因子,再减去丢包得到目标函数。
Note:该目标函数并不是TCP友好的,它会抢占TCP资源。

PCC非常灵活

通过设置不同的目标函数,发送端可以选择对时延、丢包率、吞吐量等目标进行优化。注意,这仅仅需要对一行代码进行修改,这使得PCC非常灵活。

如何部署PCC

要部署PCC只需在发送端对控制算法进行改动。
Note:无需改动路由器,没有引入新协议,也无需对接收者进行改动。

Note:作者提供了PCC的用户态PCC实现。

FAQ

    1. PCC是否能够与TCP和平共处?
      设置适当的目标函数可以使得他们和平共处。
    1. 如果大家都故意设置一个利己的目标函数,是否会对网络生态造成影响?
      大家都知道浏览器会打开多个TCP来提高速度,这种行为其实是相似的,这并不会造成非常严重的生态影响。
    1. 在这种架构下,各种流如何根据优先级等进行加权平均?是否可以通过设置一个合适的目标函数?还是得中间设备支持?
      still don’t know.

总结

PCC通过设置一个目标函数并不断探测发送速率变化带来的影响来控制发送端的速率,这样做不用像传统TCP一样对网络进行假设,不依赖hardwired mapping。但PCC有一个致命的缺点,就是收敛速率太慢。
PCC挖了很多坑。
一个大坑是:如何设置一个有效的目标函数? 是否存在一个目标函数,它是TCP友好的,而且也能收敛到一个Nash equilibrium点。

最后

PCC出了改进版:PCC Vivace(NSDI '18)。后续读完PCC Vivace再写一篇阅读笔记。

你可能感兴趣的:(Congestion,Control,论文笔记)