martes, 25 de julio de 2017

Incrementa la velocidad de red en Linux con el algoritmo BBR de control de congestión de TCP

Incrementa la velocidad de red en linux con el algoritmo BBR de control de congestion de TCP.

Fuente.

Hace poco leí que TCP BBR ha aumentado significativamente el rendimiento y redujo la latencia de las conexiones en las redes backbone internas de Google y los servidores web google.com y YouTube en un 4 por ciento en promedio a nivel mundial y en más del 14 por ciento en algunos países. 

El parche TCP BBR debe aplicarse al kernel de Linux. El primer lanzamiento público de BBR fue aquí, en septiembre de 2016. El parche está disponible para cualquiera para descargar e instalar. Otra opción es usar Google Cloud Platform (GCP). GCP por defecto activado para utilizar un nuevo algoritmo de control de congestión de vanguardia denominado TCP BBR.

Todo ello gracias a la activación en el kernel Linux de BBR (bottleneck bandwidth and round-trip propagation time), el algoritmo de control de congestión de tráfico TCP. En esta entrada veremos cómo se activa en Linux, para lo que será necesaria la versión 4.9 o superior.






"BBR permite que los 500.000 sitios de WordPress en nuestra plataforma de experiencia digital se carguen a la velocidad de la luz.Según las pruebas de Google, el rendimiento de BBR puede alcanzar hasta 2.700x más alto que el mejor control de congestión basado en pérdidas de hoy. Innovaciones como BBR son sólo una de las muchas razones por las que nos asociamos con GCP ". 
- Jason Cohen, fundador y CTO, WP Engine


Requerimientos:

Asegúrese de que su kernel de Linux tiene la siguiente opción compilada como módulo o incorporada en el kernel de Linux:

 CONFIG_TCP_CONG_BBR

 CONFIG_NET_SCH_FQ

Debe utilizar el kernel de Linux versión 4.9 o superior. En un Debian / Ubuntu Linux, escriba el siguiente comando grep / egrep:

$ grep 'CONFIG_TCP_CONG_BBR' /boot/config-$(uname -r)
$ grep 'CONFIG_NET_SCH_FQ' /boot/config-$(uname -r)
$ egrep 'CONFIG_TCP_CONG_BBR|CONFIG_NET_SCH_FQ' /boot/config-$(uname -r)


Tiene que salir algo asi:


Estoy usando la versión del kernel de Linux 4.10.0-28. Si las opciones anteriores no se encuentran, debe compilar el último kernel o instalar la última versión del kernel de Linux utilizando el comando apt-get / apt.

Cómo habilitar el control de congestión TCP BBR en Linux


Edite el archivo /etc/sysctl.conf o cree un nuevo archivo en el directorio /etc/sysctl.d/:

$ sudo vi /etc/sysctl.conf
O
$ sudo vi /etc/sysctl.d/10-custom-kernel-bbr.conf
Añade las siguientes dos líneas:
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

Guarda y cierro el fichero por ejemplo usando el editor vim y teclea :x 
Después deber reiniciar o releer la configuración con comando sysctl

$ sudo reboot

O
$ sudo sysctl --system
Ejemplo de output:
* Applying /etc/sysctl.d/10-console-messages.conf ...
kernel.printk = 4 4 1 7
* Applying /etc/sysctl.d/10-custom.conf ...
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
kernel.kptr_restrict = 1
* Applying /etc/sysctl.d/10-link-restrictions.conf ...
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/10-lxd-inotify.conf ...
fs.inotify.max_user_instances = 1024
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
kernel.sysrq = 176
* Applying /etc/sysctl.d/10-network-security.conf ...
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
* Applying /etc/sysctl.d/10-ptrace.conf ...
kernel.yama.ptrace_scope = 1
* Applying /etc/sysctl.d/10-zeropage.conf ...
vm.mmap_min_addr = 65536
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...

You can verify new settings with the following sysctl command. Run:
sysctl net.core.default_qdisc
net.core.default_qdisc = fq
sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr

Testearlo:

Puedes testearlo entre dos puntos distantes, con los puertos a Gigabit  conectados a internet y mandando entre  250Mbits/s y 800Mbits/s. puedes usar  por ejemplo el comando wget :

$ wget https://your-server-ip/file.iso
También me di cuenta de que era capaz de empujar casi 100 Mbit / s para mi tráfico OpenVPN. Anteriormente pude empujar hasta 30-40 Mbit / s solamente. En general estoy bastante satisfecho con TCP BBR opción de control de congestión para mi caja de Linux.
References