- How to Boost Linux Server Internet Speed with TCP BBR
- Requirements
- How to Check Kernel Modules in Linux
- Enabling TCP BBR Congestion Control in Linux
- Testing TCP BBR Congestion Control Configuration
- TCP Congestion Control или Почему скорость прыгает
- TCP Congestion Control, или TCP Congestion Avoidance Algorithm.
- Что это такое?
- Какие есть алгоритмы?
- Тест 3G
- Тест WiMAX и WiFi каналов
- Тест высокоскоростного канала
- Как поменять?
- Вместо заключения
How to Boost Linux Server Internet Speed with TCP BBR
BBR (Bottleneck Bandwidth and RTT) is a relatively new congestion control algorithm written by software engineers at Google. It is the latest solution out of Google’s persistent attempts to make the Internet faster via the TCP protocol – the workhorse of the Internet.
The primary aim of BBR is to boot network utilization and reduce queues (that result into slow network activity): it should be deployed on servers, but not in the network or the client side. In Linux, BBR is implemented in kernel version 4.9 or higher.
In this article, we will briefly explain TCP BBR, then proceed to show how to boost a Linux server Internet speed using TCP BBR congestion control in Linux.
Requirements
You should have Linux kernel version 4.9 or above installed, compiled with these options (either as a module or inbuilt into it):
How to Check Kernel Modules in Linux
To check if the above options are compiled in your kernel, run these commands:
# cat /boot/config-$(uname -r) | grep 'CONFIG_TCP_CONG_BBR' # cat /boot/config-$(uname -r) | grep 'CONFIG_NET_SCH_FQ'
To update your kernel, check out these guides:
Enabling TCP BBR Congestion Control in Linux
BBR works effectively with pacing, so it must be employed together with the fq qdisc classless packet scheduler for traffic pacing. To find more information about fq qdisc, type:
With the fair understanding of BBR, you can now configure it on your server. Open the /etc/sysctl.conf file using you favorite editor.
Add the options below at the end of the file.
net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
Save and close the file. Then effect the changes in the system using the sysctl command.
From the screen shot blow, you can see the options have been added with the appropriate values.
Testing TCP BBR Congestion Control Configuration
After performing the necessary configurations, you can test if it is practically working. There are several tools for measure bandwidth speed such as Speedtest-CLI:
Other tools include bmon (bandwith monitor), nload, Wget – command based file downloader and cURL which all show network bandwidth; you can use them for testing.
You may also like to read following related articles.
In this article, we showed how to boost Linux server Internet speed using TCP BBR congestion control in Linux. Test it comprehensively under different scenarios and give us any important feedback via the comment form below.
Overview
How to check and set TCP congestion control algorithms (CCA) in Linux.
Details
Check Current CAA
sysctl net.ipv4.tcp_congestion_control
jemurray@home-server:~$ sysctl net.ipv4.tcp_congestion_control net.ipv4.tcp_congestion_control = cubic
View Available CCAs
Check for the default CCAs in Ubuntu:
sysctl net.ipv4.tcp_available_congestion_control
jemurray@home-server:~$ sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = reno cubic
Load Additional Modules
Linux has quite a few different CCAs available: https://en.wikipedia.org/wiki/TCP_congestion_control — Not all are loaded in the kernel by default.
List installed, but not necessarily loaded CCAs:
ls -al /lib/modules/`uname -r`/kernel/net/ipv4/tcp*
jemurray@home-server:~$ ls -al /lib/modules/`uname -r`/kernel/net/ipv4/tcp* -rw-r--r-- 1 root root 14113 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_bbr.ko -rw-r--r-- 1 root root 10913 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_bic.ko -rw-r--r-- 1 root root 13865 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_cdg.ko -rw-r--r-- 1 root root 10041 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_dctcp.ko -rw-r--r-- 1 root root 8401 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_diag.ko -rw-r--r-- 1 root root 7489 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_highspeed.ko -rw-r--r-- 1 root root 9985 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_htcp.ko -rw-r--r-- 1 root root 8073 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_hybla.ko -rw-r--r-- 1 root root 8985 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_illinois.ko -rw-r--r-- 1 root root 8617 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_lp.ko -rw-r--r-- 1 root root 12561 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_nv.ko -rw-r--r-- 1 root root 13441 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_probe.ko -rw-r--r-- 1 root root 6449 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_scalable.ko -rw-r--r-- 1 root root 11073 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_vegas.ko -rw-r--r-- 1 root root 7609 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_veno.ko -rw-r--r-- 1 root root 8097 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_westwood.ko -rw-r--r-- 1 root root 7945 May 7 19:44 /lib/modules/4.15.0-144-generic/kernel/net/ipv4/tcp_yeah.ko
Use modprobe to load additional modules:
sudo /sbin/modprobe tcp_bbr
jemurray@home-server:~$ sudo /sbin/modprobe tcp_bbr jemurray@home-server:~$ sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = reno cubic bbr
Temporarily Change CCA
Use sysctl to temporarily change the CCA to bbr :
sudo /sbin/sysctl -w net.ipv4.tcp_congestion_control=bbr
jemurray@home-server:~$ sudo /sbin/sysctl -w net.ipv4.tcp_congestion_control=bbr net.ipv4.tcp_congestion_control = bbr jemurray@home-server:~$ sysctl net.ipv4.tcp_congestion_control net.ipv4.tcp_congestion_control = bbr
Permanently Change the CCA
sudo su echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf sysctl -p
jemurray@home-server:~$ sudo su root@home-server:/home/jemurray# echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf root@home-server:/home/jemurray# sysctl -p net.ipv4.tcp_congestion_control = bbr
Testing with iPerf3
Test differences in CCA speeds using -C option to iPerf3:
iperf3 -i 1 -t 10 -c iperf3server.example.com -C reno
jemurray@home-server:~$ iperf3 -i 1 -t 10 -c iperf3server.example.com -C reno Connecting to host iperf3server.example.com, port 5201 [ 4] local 192.168.86.5 port 43060 connected to iperf3server.example.com port 5201 [ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 65.0 MBytes 545 Mbits/sec 711 1.37 MBytes [ 4] 1.00-2.00 sec 83.8 MBytes 702 Mbits/sec 0 1.45 MBytes [ 4] 2.00-3.00 sec 85.4 MBytes 717 Mbits/sec 0 1.53 MBytes [ 4] 3.00-4.00 sec 90.8 MBytes 762 Mbits/sec 0 1.61 MBytes [ 4] 4.00-5.00 sec 93.8 MBytes 786 Mbits/sec 2 1.68 MBytes [ 4] 5.00-6.00 sec 88.1 MBytes 739 Mbits/sec 0 1.76 MBytes [ 4] 6.00-7.00 sec 92.0 MBytes 772 Mbits/sec 0 1.83 MBytes [ 4] 7.00-8.00 sec 91.2 MBytes 765 Mbits/sec 0 1.89 MBytes [ 4] 8.00-9.00 sec 88.7 MBytes 744 Mbits/sec 0 1.96 MBytes [ 4] 9.00-10.00 sec 90.5 MBytes 759 Mbits/sec 1 2.02 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 869 MBytes 729 Mbits/sec 714 sender [ 4] 0.00-10.00 sec 867 MBytes 727 Mbits/sec receiver iperf Done. jemurray@home-server:~$ iperf3 -i 1 -t 10 -c iperf3server.example.com -C bbr Connecting to host iperf3server.example.com, port 5201 [ 4] local 192.168.86.5 port 43064 connected to iperf3server.example.com port 5201 [ ID] Interval Transfer Bandwidth Retr Cwnd [ 4] 0.00-1.00 sec 53.5 MBytes 448 Mbits/sec 3265 3.29 MBytes [ 4] 1.00-2.00 sec 80.2 MBytes 673 Mbits/sec 957 3.47 MBytes [ 4] 2.00-3.00 sec 85.4 MBytes 717 Mbits/sec 0 3.37 MBytes [ 4] 3.00-4.00 sec 87.5 MBytes 734 Mbits/sec 0 3.49 MBytes [ 4] 4.00-5.00 sec 85.6 MBytes 718 Mbits/sec 0 3.39 MBytes [ 4] 5.00-6.00 sec 86.5 MBytes 726 Mbits/sec 0 3.32 MBytes [ 4] 6.00-7.00 sec 85.4 MBytes 716 Mbits/sec 0 3.31 MBytes [ 4] 7.00-8.00 sec 88.7 MBytes 744 Mbits/sec 0 3.34 MBytes [ 4] 8.00-9.00 sec 90.9 MBytes 763 Mbits/sec 0 4.11 MBytes [ 4] 9.00-10.00 sec 89.9 MBytes 754 Mbits/sec 0 3.23 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 834 MBytes 699 Mbits/sec 4222 sender [ 4] 0.00-10.00 sec 832 MBytes 698 Mbits/sec receiver iperf Done.
TCP Congestion Control или Почему скорость прыгает
Бывало ли у вас такое, что ставите файл на закачку, и скорость медленно, но верно возрастает, затем, в какой-то момент, резко снижается, затем опять возрастает? Закачка файла в один поток не обеспечивает полную скорость канала? Запускаете торрент-клиент, и пинг в игре сильно прыгает? Используете 3G-модем (или другую линию с относительно большой потерей пакетов) и не можете это терпеть?
Наверняка вы винили во всем ваш роутер, либо обвиняли своего провайдера в кривой настройке шейпера? Это влияет, но виноваты не они.
Итак, встречайте:
TCP Congestion Control, или TCP Congestion Avoidance Algorithm.
Что это такое?
Вкратце — алгоритмы, которые пытается сделать все возможное, чтобы обеспечить наиболее быструю скорость передачи данных между двумя узлами, передающими данные через TCP. Они управляют размером TCP-окна и могут ориентироваться на RTT (Round Trip Time — время от отправки запроса до получения ответа), потерю пакетов, время ожидания отправки пакета из очереди и т.д. Каждый алгоритм по разному ведет себя в той или иной ситуации и нет какого-то универсального.
Долгое время, в ходу были алгоритмы Reno, разработанный в 1990 году, и BIC. Первый применялся во всех ОС Windows до XP, а второй — в Linux до 2.6.18. Затем, в Windows Vista появился новый алгоритм Compound TCP, а в Linux сменили BIC на Cubic.
Какие есть алгоритмы?
- BIC TCP
- CUBIC TCP
- Highspeed TCP
- H-TCP
- TCP Hybla
- TCP-Illinois
- TCP Low Priority
- TCP Vegas
- TCP NewReno
- TCP Veno
- TCP Westwood+
- YeAH-TCP
Тест 3G
К сожалению, CUBIC, который используется по умолчанию во всех дистрибутивах, совершенно не подходит, например, для 3G-соединений. Ниже представлен график сравнения 4 алгоритмов congestion avoidance для HSDPA сетей за конец 2012 года из TCP Congestion Control over HSDPA: an Experimental Evaluation:
Как видите, CUBIC в отстающих. Он значительно повысил RTT на полной утилизации 3G канала, в то время как Westwood+ и NewReno более-менее справляются с этой проблемой.
Давайте взглянем на количество ретрансмиссий:
Как видно из графика, у CUBIC относительно большое количество ретрансмиссий
В то же время, он лидирует в скорости передачи данных за единицу времени.
Что это значит? Это значит, что с использованием Westwood+ или NewReno вы сможете комфортней серфить интернет, пока у вас скачивается большой файл.
Тест WiMAX и WiFi каналов
Тест взят из Comparative Performance Evaluation of TCP Variants in WiMAX (and WLANs) Network Configurations — еще одного интересного сравнения алгоритмов для беспроводных сетей.
В тесте №1 используется соединение компьютер-wimax.роутер-wimax.клиент с пропускной способностью между компьютером и роутером в 100 мбит/с и RTT в 45 мс и соотношением DL:UL 1:1 между wimax роутером и клиентом.
Зависимость эффективной передачи данных от потери пакетов:
Чуть изменим тест. В тесте №2 используется схема компьютер-роутер1-роутер2-wimax.роутер-wimax.клиент, где RTT 10 мс. между компьютером и первым роутером, далее используется 10 мбит/с канал с 25 мс. RTT, между вторым и wimax роутером канал опять 100 мбит/с c RTT в 10 мс.
Как видно из графиков, лидерство держит Westwood.
Картина для WiFi схожа с WiMAX:
Тест высокоскоростного канала
Этот тест взят из технического отчета алгоритма YeAH-TCP за 2006 год. Теоретически, YeAH является самым продвинутым алгоритмом и нацелен работать как можно лучше на высокоскоростных линиях, на линиях с высокой задержкой или высокими потерями пакетов.
Тесты делались с импользованием канала пропускной способностью в 500 mbit/s
В эффективной передаче данных в зависимости от RTT лидирует YeAH
Зависимость эффективной передачи данных и потери пакетов, опять YeAH занимает первое место
К сожалению, с YeAH на ядре 3.7 какие-то проблемы, через некоторое время он весит систему software interrupt’ами. Такого поведения не наблюдается на 3.6.
Как поменять?
Сменить Congestion Algorithm достаточно просто, всего одна строка:
sysctl -w net.ipv4.tcp_congestion_control=westwood
Где вместо westwood можно вставить названия из /lib/modules/. /kernel/net/ipv4/tcp_. ko без префикса tcp_.
Вместо заключения
На каналах вроде домашнего вайфая, рекомендую использовать Westwood или H-TCP. Для проводных каналов хорошим выбором может быть YeAH (если у вас не наблюдается с ним проблем), H-TCP или Illinois.
Несколько советов. Если у вас уже ядро 3.6+, обязательно включите net.ipv4.tcp_fastopen. Никаких проблем с несовместимыми серверами это не добавит, а handshake для поддерживаемых ускорит.
Также рекомендую установить net.ipv4.tcp_slow_start_after_idle в 0, это добавит скорости для SPDY и других keep-alive соединений.