TCP Congestion Control Algorithms in Linux


Overview

How to check and set TCP congestion control algorithms (CCA) in Linux.

Details

Check Current CAA

sysctl net.ipv4.tcp_congestion_control

Output Example:

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

Output Example:

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*

Output Example:

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

Output Example:

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

Output Example:

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

Output Example:

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.