Linux TCP BBR congestion control

Veröffentlicht von

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.

Teile diesen Beitrag

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert