测试 TCP BBR 对网络丢包的改善效果

TCP BBR 出来已经有挺长一段时间了,都说它可以减少 TCP 连接的延迟、改善存在丢包的网络环境速度,虽然我自己一直在用,但由于从来没有测试过,所以对它具体能发挥多大的作用还是存疑的。

正好最近了解到了一个命令 tc ,可以模拟网络延迟和丢包,于是决定来亲自测试一下 BBR 对网络丢包的改善效果。

TCP BBR 开启和关闭的教程可以查看之前的文章:内核版本 4.9 以上的 Linux 系统开启/关闭 BBR 的方法

测试环境

为了获得充足的网速以便能够看到明显效果,同时排除其他环境因素的影响,本次测试在本地回环地址 127.0.0.1 上进行。输入 ifconfig 可以查看网卡情况,我这里绑定地址 127.0.0.1 的网卡名为 lo

在本地起一个监听 127.0.0.1 的 http 服务(我这里是用 caddy 实现的),然后在其中放一个比较大的文件(我这里是一个 600 多兆的系统镜像),后续将通过 wget 下载该文件来测试网络速度。

为了避免硬盘本身写入速度的限制,这里直接将文件 wget 到内存当中去(使用内存设备文件 /dev/shm

模拟丢包网络环境

这里使用 tc 命令来模拟所需要的网络环境,该命令的具体用法不再多说,自己输入 man tc 查看即可。

执行以下命令可以在网卡 lo 上模拟 10% 的丢包:

1
tc qdisc add dev lo root netem loss 10%

要恢复正常情况的话执行以下命令即可:

1
tc qdisc del root dev lo

测试过程及结果

先进入内存设备文件:

1
cd /dev/shm

使用以下命令从回环地址 127.0.0.1 的 http 服务中下载文件进行测速:

1
wget http://127.0.0.1:8080/debian-10.3.0-amd64-xfce-CD-1.iso

不开启 BBR 的结果

不开启 BBR ,在正常(无丢包)网络环境下的测试结果如下图,640M 的文件下载花了 0.7s ,还是很快的。

不开启 BBR,正常网络环境的下载速度

不开启 BBR ,在 1% 丢包网络环境下的测试结果如下图,640M 的文件花了 5.5s 下完,相比正常情况下的网络速度有一定程度降低。

不开启 BBR,1% 丢包网络环境的下载速度

不开启 BBR ,在 10% 丢包网络环境下的测试结果如下图,可以看到同样 640M 的文件下载花了 50s ,相比正常情况下网络速度发生了大幅度降低。

不开启 BBR,10% 丢包网络环境的下载速度

开启 BBR 的结果

开启 BBR ,在正常(无丢包)网络环境下的测试结果如下图,640M 的文件同样花了 0.7s 下完,跟不开启 BBR 时的速度没有差别。

开启 BBR,正常网络环境的下载速度

开启 BBR ,在 1% 丢包网络环境下的测试结果如下图,640M 的文件还是花了 0.7s 下完,跟正常网络环境下的速度几乎一样,这相比同样 1% 丢包网络环境但不开启 BBR 时的 5.5s 有很大的提升。

开启 BBR,1% 丢包网络环境的下载速度

开启 BBR ,在 10% 丢包网络环境下的测试结果如下图,可以看到同样 640M 的文件下载花了 7.5s ,这虽然没有前面跟正常网络环境下速度几乎一样那么恐怖,但相比同样 10% 丢包网络环境不开启 BBR 时的 50s 还是有很大程度提升的。

开启 BBR,10% 丢包网络环境的下载速度

结果总结

上面的测试通过一个简单的场景来验证了 TCP BBR 对于丢包情况下网络速度的优化。从结果中可以看到 TCP BBR 对于网络丢包的改善效果十分显著,在少量丢包的情况下甚至可以做到与正常网络环境速度无异,虽然在大量丢包时速度仍会下降,但跟不开启 BBR 的情况相比还是有很大的提升(比不开启 BBR 的情况速度降得更少)。

所以,如果你的机器、网络环境存在丢包导致跑不满带宽的话,不妨开启 BBR 试一下吧!