重现 Bufferbloat 结果
解决 BufferBloat 问题
处理的可视化脚本位于 10-bufferbloat/reproduce_data.ipynb 中,实验根据获取的数据,利用 Matplotlib 画图,得到了下列结果。

上图为拥塞窗口大小随时间变化的曲线。测试刚开始时,队列大小为 100 的拥塞窗口迅速增长达到 600 的峰值,队列大小为 200 的的拥塞窗口迅速增长达到 1200 的峰值。可见该实验环境下,拥塞窗口峰值大小为队列大小的两倍。
接着拥塞窗口迅速回落到队列大小一致的水平,接着再次增长。拥塞窗口随收包增长,随丢包下降。另外可以看到大队列后续的波动较小队列不明显。

上图为即时队列长度随时间变化的曲线。队列大小为 100 的曲线的上界为 100。测试刚开始时队列快速上升达到峰值,当队列满时,直接丢弃新接收的包,由于发送速率骤降,使得队列长度降低至最大队列长度的 40% 左右。随后一直这次循环下去。

上图为 RTT 随时间变化的曲线。测试刚开始时,由于接收队列的快速增长,网络延时急剧增加,随后也随着队列缩短而减少。之后的时间内,延时随着队列长度的变化而变化,波动明显。另外可以看到大队列后续的波动较小队列不明显。
队列大小 200 时,iperf Transfer 成功的带宽平均大约为 29.4Mb/s,峰值为 37.7 Mb/s,有 2/3 的时间区间会下降到 0。
队列大小 100 时,iperf Transfer 成功的带宽平均大约为 15Mb/s,峰值为 37.7 Mb/s,有 1/3 的时间区间会下降到 0。
队列大小 10 时,iperf Transfer 成功的带宽平均大约为 9Mb/s,峰值为 12.6 Mb/s,最低为 6.9Mb/s。
因此可以看出队列越长,iperf Transfer 为 0 的可能性越大,但是 Transfer 成功时的带宽也越大。

上图中出现了三种方式来 BufferBloat 问题的曲线。
可以看出,tail drop 的队列延时远高于 RED 和 CoDel。其中 CoDel 的性能表现最佳。
另外值得注意的是,tail drop 曲线一直出现“尖端”情况,和 ppt 中稳定的一段峰值不同,这是因为 Mininet 环境下仿真环境的差异导致的。在 Mininet 中,maxq 参数实际上是一个模拟延迟和丢包的批处理大小,与真实的队列大小有区别,只是近似仿真。因此结果存在差异。