Congestion control in linux tcp

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'

Check Kernel Modules

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

Enabling TCP BBR in Linux

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.

Verify Kernel Parameters

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. 

Источник

Читайте также:  Linux создать раздел и отформатировать

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

image

К сожалению, CUBIC, который используется по умолчанию во всех дистрибутивах, совершенно не подходит, например, для 3G-соединений. Ниже представлен график сравнения 4 алгоритмов congestion avoidance для HSDPA сетей за конец 2012 года из TCP Congestion Control over HSDPA: an Experimental Evaluation:

Читайте также:  How to install ghidra on linux

Как видите, CUBIC в отстающих. Он значительно повысил RTT на полной утилизации 3G канала, в то время как Westwood+ и NewReno более-менее справляются с этой проблемой.
Давайте взглянем на количество ретрансмиссий:

image

Как видно из графика, у CUBIC относительно большое количество ретрансмиссий

image

В то же время, он лидирует в скорости передачи данных за единицу времени.

Что это значит? Это значит, что с использованием Westwood+ или NewReno вы сможете комфортней серфить интернет, пока у вас скачивается большой файл.

Тест WiMAX и WiFi каналов

Тест взят из Comparative Performance Evaluation of TCP Variants in WiMAX (and WLANs) Network Configurations — еще одного интересного сравнения алгоритмов для беспроводных сетей.

image

В тесте №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 мс.

image
image

Как видно из графиков, лидерство держит Westwood.
Картина для WiFi схожа с WiMAX:

image

Тест высокоскоростного канала

Этот тест взят из технического отчета алгоритма YeAH-TCP за 2006 год. Теоретически, YeAH является самым продвинутым алгоритмом и нацелен работать как можно лучше на высокоскоростных линиях, на линиях с высокой задержкой или высокими потерями пакетов.
Тесты делались с импользованием канала пропускной способностью в 500 mbit/s

image

В эффективной передаче данных в зависимости от RTT лидирует YeAH

image

Зависимость эффективной передачи данных и потери пакетов, опять 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 соединений.

Источник

Оцените статью
Adblock
detector