CentOS 7: TCP BBR

Рассмотрим как установить модуль TCP BBR, чтобы получить ускорение в работе TCP стека.

Зачем это нужно?

Еще в 2016 году Google выпустила патч для ускорения TCP стека Linux и все это вылилось в алгоритм TCP BBR. Поскольку в качестве десктопа использую Project Solus и там он присутствует довольно давно, то надо сказать этот алгоритм впечатлил по своей производительности. Если при таких алгоритмах как Yeah, Illinois и т.д. надо устанавливать модули на стороне десктопа, то TCP BBR достаточно установить на стороне сервера и уже получить ускорение в работе серверного программного обеспечения.

CentOS 7: TCP BBR 1
До и После BBR

Обновление ядра

Перед обновлением ядра традиционно обновляем дистрибутив до последнего актуального состояния. Далее устанавливаем репозиторий elrepo и ставим Mainline ядро (на текущий момент версия 5.3.8). Кстате перед установкой удаляем конфликтные пакеты headers и tools при этом будут удалены некоторые зависимости вроде gcc, libtool и т.д. Список этот надо будет скопировать в блокнот, чтобы установить обратно после обновления ядра:

yum upgrade
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum remove kernel-headers kernel-tools kernel-tools-libs
yum --enablerepo=elrepo-kernel install kernel-ml-*

Теперь надо поменять приоритет запуска ядра. Чтобы проверить запускается ли новое ядро можете перезагрузиться и вручную выбрать запускаемое ядро и если все норм, то уже потом поменять приоритет запуска по-умолчанию:

egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
CentOS Linux (5.3.8-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-957.1.3.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-693.11.6.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-514.10.2.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-3934c965e68349119a778503056f71d4) 7 (Core)

В этом списке элементы начинаются с нуля т.е. 5.3.8-1.el7.elrepo.x86_64 это 0, 3.10.0-957.1.3.el7.x86_64 это 1, 3.10.0-693.11.6.el7.x86_64 это 2 и т.д. В /etc/default/grub меняем строку GRUB_DEFAULT=saved на GRUB_DEFAULT=0 и выполняем grub2-mkconfig -o /boot/grub2/grub.cfg. Далее перезагрузка и новое ядро уже будет загружаться по-умолчанию, что можно будет проверить командой uname -r. Если не помогло, то попробуйте grub2-set-default 0.

Траблы

При первой попытке конечно был конфликт с пакетами kernel-headers и kernel-tools о чем выше написал. После решения этого конфликта при загрузке система загружалась в maintanence режиме. В логе /var/log/boot.log ничего не обычного не нашлось, а в dmesg после долгого листания обнаружил забавную вещь. Дело в том, что в качестве файловой системы использовал XFS и в /etc/fstab была прописана директива nobarrier для ускорения работы файловой системы. Именно на эту директиву жаловалось новое ядро выдавая сообщение unknown option. Чиним:

mount -o rw,remount /centos-root /
vi /etc/fstab
/dev/mapper/centos-root /   xfs     defaults        0 0

Перезагружаемся и теперь система нормально загружается с новым ядром.

Запускаем TCP BBR

Для этого в /etc/sysctl.conf надо прописать всего 2 строки:

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

Но поскольку недавно перетюнивал sysctl, то выложу весь листинг:

fs.file-max = 65535
fs.inotify.max_user_watches = 16777216
kernel.pid_max = 65536
kernel.randomize_va_space = 1
net.core.default_qdisc = fq
net.core.netdev_max_backlog = 2500
net.core.rmem_max = 16777216
net.core.somaxconn = 65535
net.core.wmem_max = 16777216
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.rp_filter = 2
net.ipv4.ip_forward=0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.flush = 1
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_fastopen = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_sack = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_source_route = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 6
vm.swappiness = 1
vm.vfs_cache_pressure = 100

Применяем новые параметры sysctl —system или sysctl -p и готово.

Самый простой вариант как проверить это попробовать подключиться по SSH и сразу увидите насколько шустро сервер ответит (конечно при условии, что прописана директива UseDNS no).

TCP BBR для FreeBSD появится в релизе 13. Еще ждать и ждать.

А если ZFS?

Не беда. Если есть возможность, то сделайте резервную копию раздела или файлов. Если нет возможности, то не страшно. После установки файловой системы пул будет примонтирован заново. Останавливаем все сервисы, которые запускаются с раздела ZFS и устанавливаем новую версию. Подразумевается, что система уже запущена под ядром 5.3.8:

systemctl stop postgresql-10
systemctl disable postgresql-10
systemctl stop tomcat
systemctl disable tomcat
yum remove zfs zfs-kmod spl spl-kmod libzfs2 libnvpair1 libuutil1 libzpool2 zfs-release
yum install http://download.zfsonlinux.org/epel/zfs-release.el7_7.noarch.rpm
yum clean metadata
yum install zfs
reboot
lsmod|grep zfs
systemctl start postgresql-10
systemctl enable postgresql-10
systemctl start tomcat
systemctl enable tomcat

Ну вот. Остановили сервисы, переустановили и все тип-топ.

Вас может заинтересовать предыдущая статья о «основах работы в терминале«.