TCP BBR, Bottleneck Bandwidth and RTT, verspricht den Durchsatz und die Latenz von TCP Verbindungen deutlich zu verbessern. Entwickelt wurde es von Google und wird schon auf google.com und YouTube eingesetzt. Vereinfacht gesagt wartet BBR bei Packet Loss deutlich länger darauf seine Geschwindigkeit zu reduzieren als andere congestion control Algorithmen, wie Reno oder CUBIC, und kann damit schnelle Internetleitungen besser ausnutzen.
Anforderungen
TCP BBR Erfordert mindestens Kernel 4.9. Ubuntu 17.04 und Ubuntu 18.04 liefern es schon mit. Bei Ubuntu 16.04 lässt sich ein passender Kernel mit dem Hardware Enablement Stack nachinstallieren. Bei Debian wird erst ab Version 9 ein passender Kernel mitgeliefert.
Installation unter Ubuntu 16.04
root@vps07:~# apt install --install-recommends linux-generic-hwe-16.04
Module überprüfen
Nach der Installation des passenden Kernels lässt sich überprüfen, ob die nötigen Kernel Module geladen sind.
root@vps07:~# egrep 'CONFIG_TCP_CONG_BBR|CONFIG_NET_SCH_FQ' /boot/config-$(uname -r)
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m
Geschwindigkeitstests vorher
Für einen Performance Vergleich (vorher / nachher) nutze ich iperf.
Server:
root@vps07:# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 185.243.8.141 port 5001 connected with 5.146.198.226 port 35610
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-30.5 sec 35.8 MBytes 9.84 Mbits/sec
Client:
root@Sanctuary:# iperf -c vps07.geekbundle.org -i 2 -t 30
------------------------------------------------------------
Client connecting to vps07.geekbundle.org, TCP port 5001
TCP window size: 512 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.137 port 63369 connected with 185.243.8.141 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 2.0 sec 4.88 MBytes 20.4 Mbits/sec
[ 3] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 3] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 3] 6.0- 8.0 sec 2.50 MBytes 10.5 Mbits/sec
[ 3] 8.0-10.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 3] 10.0-12.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 3] 12.0-14.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 3] 14.0-16.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 3] 16.0-18.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 3] 18.0-20.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 3] 20.0-22.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 3] 22.0-24.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 3] 24.0-26.0 sec 3.25 MBytes 13.6 Mbits/sec
[ 3] 26.0-28.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 3] 28.0-30.0 sec 1.62 MBytes 6.82 Mbits/sec
[ 3] 0.0-30.3 sec 35.8 MBytes 9.90 Mbits/sec
Erklärung iperf
- -c connect
- -i Interval in Sekunden
- -t time, Wie lange der Test laufen soll
Konfiguration TCP BBR
Welche TCP congestion control Algorithmen sind momentan verfügbar:
root@vps07:~# sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = cubic reno
Welcher TCP congestion control Algorithmus ist aktiv:
root@vps07:~# sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic
TCP BBR aktivieren:
root@vps07:~# nano /etc/sysctl.d/10-kernel-bbr.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
root@vps07:~# sysctl --load=/etc/sysctl.d/10-kernel-bbr.conf
Geschwindigkeitstests nachher
Server
root@vps07:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 185.243.8.141 port 5001 connected with 5.146.198.226 port 56611
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-30.1 sec 141 MBytes 39.2 Mbits/sec
Client
root@Sanctuary:# iperf -c vps07.geekbundle.org -i 2 -t 30
------------------------------------------------------------
Client connecting to vps07.geekbundle.org, TCP port 5001
TCP window size: 512 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.137 port 31132 connected with 185.243.8.141 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 2.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 2.0- 4.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 4.0- 6.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 6.0- 8.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 8.0-10.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 10.0-12.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 12.0-14.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 14.0-16.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 16.0-18.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 18.0-20.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 20.0-22.0 sec 9.25 MBytes 38.8 Mbits/sec
[ 3] 22.0-24.0 sec 9.50 MBytes 39.8 Mbits/sec
[ 3] 24.0-26.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 26.0-28.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 28.0-30.0 sec 9.38 MBytes 39.3 Mbits/sec
[ 3] 0.0-30.0 sec 141 MBytes 39.3 Mbits/sec
Fazit
Zusammengefasst die vorher und nachher Tests
- Vor BBR:
- Transfer: 35.8 MBytes
- Durchsatz: 9.84 Mbits/sec
- Nach BBR:
- Transfer: 141 MBytes
- Durchsatz: 39.2 Mbits/sec
TCP BBR schafft einen deutlichen Performancegewinn. Allerdings ist es auch umstritten, wie heise berichtet. Denn es schafft den Performancegewinn auf Kosten anderer Nutzer. Wo TCP sonst versucht tollerant zu sein und Puffer frei zu halten reißt BBR sprichwörtlich alles an sich. Sollten ausserdem mehrere Server mit BBR um die Bandbreite streiten, könnten diese sich gegenseitig blockieren und würden nicht versuchen miteinander zu kooperieren wie andere congestion control Algorithmen. Es könnte also sein, dass es momentan nur gut funktioniert, weil es bisher nur auf wenigen Servern im Einsatz ist.