Рубрики
*NIX информация

Тюнинг сети linux / производительность / Контроль перегрузки

ссылки:

https://habr.com/ru/articles/168407/
https://habr.com/ru/articles/331720/
https://habr.com/ru/companies/otus/articles/550820/
https://habr.com/ru/articles/115527/
RTT Calculator
https://www.opennet.ru/base/net/tcp_tune.txt.html

Алгоритмы:

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
BBR

BIC, CUBIC, Highspeed, H-TCP, NewReno, Illinois - эти алгоритмы созданы для так называемых long fat networks ­— длинных (а значит, с высоким RTT) и быстрых сетей.
TCP Hybla - здорово ведет себя на спутниковых линках.
Veno - создан для беспроводных сетей с высокой потерей пакетов.
TCP Low Priority - вообще сложно назвать congestion алгоритмом, т.к. он мало что делает, а просто пытается отправить пакет без очереди.
TCP Vegas - иногда применяют на серверах с большим количеством подключений т.к. он обеспечивает почти постоянную скорость, хоть и далеко не идеальную.
Westwood+ - комбинированный алгоритм
YeAH-TCP - молодой, ведет себя более-менее во всех случаях.

CUBIC, который используется по умолчанию во всех дистрибутивах, совершенно не подходит, например, для 3G-соединений


На каналах вроде домашнего вайфая, рекомендую использовать Westwood или H-TCP. 
Для проводных каналов хорошим выбором может быть YeAH (если у вас не наблюдается с ним проблем), H-TCP или Illinois.

рекомендации:
net.ipv4.tcp_fastopen=1 - Ускоряет а handshake для поддерживаемых алгоритмов
net.ipv4.tcp_slow_start_after_idle=0 - Добавит скорости для SPDY и других keep-alive соединений

ethtool

Длина очереди передачи.
В современных сетях для 1G используется значение 1000, для 10G используется значение 10000.
ifconfig eth0 txqueuelen 1000
 
Отключаем checksum offload для правильной работы шейперов
ethtool --offload eth0 rx off tx off
 
Отключаем аппаратную поддержку 802.1q
ethtool -K eth0 rxvlan off txvlan off
 
Увеличивает размер буфера, чтобы избежать дропов.
Убедитесь, что ваша сетевая поддерживает такой размер буфера выполнив ethtool -g ethX
ethtool -G eth0 rx 2048 tx 2048
 
Отключает авто определение скорости порта
ethtool -A eth0 autoneg off rx off tx off
 
Отключим оффлоады для лучшей производительности TCP
ethtool -K eth0 tso off gso off gro off lro off

Flow control  автосогласование  Advertised pause frame use
"Advertised pause frame use" и "Link partner advertised pause frame use" указывают на режим управления потоком. 
Если они установлены в Symmetric, то управление потоком включено. Если установлено No, то оно выключено. 
Проверяем:
ethtool -a eth0 
чтобы включить
ethtool -A eth0 autoneg on rx on tx on



Лимиты:

ulimit -a - Показать текущие лимиты

Пример установки лимитов: 
ulimit -n 30000

Некоторые приложения (Proxy, Web сервера, базы данных) используют большие количества открытых файлов и сокетов, 
и как правило, установок по умолчанию им недостаточно.
 
Оболочка/скрипт
За лимиты оболочки отвечает ulimit. 
Текущее состояние можно проверить ulimit -a. 

Например, что-бы увеличить кол-во открытых файлов с 1024 до 10240 нужно сделать:
ulimit -n 10240

пользователь/процесс
Лимиты пользователей и процессов устанавливаются в /etc/security/limits.conf. 
Например:
# cat /etc/security/limits.conf
*   hard    nproc   250              # Лимит пользовательских процессов
asterisk hard nofile 409600          # Лимит открытых файлов для приложения
 
 
Обще системные лимиты устанавливаются командой Sysctl. 
Большинство этих переменных, действуют до перезагрузки, что-бы ограничения остались после ребута, внесите их в файл /etc/sysctl.conf.
сat /etc/sysctl.conf               # Показать файл
sysctl -a                          # Показать все системные переменные
sysctl fs.file-max                 # Показать текущие значения
sysctl -w fs.file-max=102400       # Изменить максимальное кол-во открытых файлов
fs.file-max=102400                 # Постоянное значение в файле sysctl.conf
cat /proc/sys/fs/file-nr           # Кол-во используемых файловых дескрипторов


sysctl


Маршрутизация между интерфейсами, по умолчанию выключена net.ipv4.ip_forward=0
net.ipv4.ip_forward=1

Принцип фильтрования в rp_filter:
Если ответ на текущий пакет не может уйти через тот же интерфейс (когда приходит через один интерфейс, а уходит через другой), пакет отфильтровывается.
По умолчанию равно 2
net.ipv4.conf.all.rp_filter = 1
Обычно меняю на 0 или 1 при использовании двух шлюзов
----------------------------
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
----------------------------


!!! Современные дистрибутивы автоматически настраивают оптимальные параметры сетевой карты 

###Для хоста с сетевым адаптером 10G, оптимизированного для сетевых путей с RTT до 100 мс и для удобства работы с инструментами одиночного и параллельного потока
 
# устанавливаем буферами до 64 МБ
net.core.rmem_max = 67108864 
net.core.wmem_max = 67108864 

# увеличить лимит буфера TCP автонастройки
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432


# рекомендуемый контроль перегрузки по умолчанию / recommended default congestion control is htcp 
# на 2023 дефолт cubic
# для проверки доступных 
sysctl -a | grep congestion
net.ipv4.tcp_congestion_control=htcp
#net.ipv4.tcp_congestion_control=veno
#net.ipv4.tcp_congestion_control=cubic
#net.ipv4.tcp_congestion_control=bbr

# Если включены "jumbo frames"  то "tcp_mtu_probing" также следует включить
net.ipv4.tcp_mtu_probing=1


# Тип очереди
Рекомендуется включить "fair queueing/справедливую очередь"
net.core.default_qdisc = fq
 
 
Для хоста с сетевым адаптером 10G, оптимизированным для сетевых путей с RTT до 200 мс и для совместимости с инструментами одиночного и параллельного потока, 
или с сетевым адаптером 40G на путях с RTT до 50 мс:
 
# Буфер 128MB
net.core.rmem_max = 134217728 
net.core.wmem_max = 134217728 
# Авто тюнинг буфера 64MB
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# # рекомендуемый контроль перегрузки по умолчанию / recommended default congestion control
net.ipv4.tcp_congestion_control=htcp # на самом деле тут дофига вариантов brr, cubic, westwood+
# Если "jumbo frames enabled" то и этот параметр нужен.
net.ipv4.tcp_mtu_probing=1
# Тип очередей
net.core.default_qdisc = fq

Под trex

ulimit -n 30000

net.ipv4.ip_forward=1
net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_max_syn_backlog = 131072
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 8
net.ipv4.tcp_rmem = 16384 174760 349520
net.ipv4.tcp_wmem = 16384 131072 262144
net.ipv4.tcp_mem = 262144 524288 1048576
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_low_latency = 1
net.ipv4.tcp_syncookies = 0
net.netfilter.nf_conntrack_max = 1048576

RTT/ Буферы / Как посчитать буфер, пример:

Не актуальные умолчания:
Windows XP размер буфера по умолчанию равен 17,520 байт
Mac OS X установлен в 64K
Linux  64Кбайт

Формула:
Пропускная способность = размер буфера / задержка
Винда:
17520 Байт / .04 секунды = .44 МБ/сек = 3.5 Мб/сек
Мак ос:
65936 Байт / .04 сек = 1.6 МБ/сек = 13 Мб/сек


Большинство экспертов по сетям соглашаются, что оптимальный размер
буфера для определенной сети равен удвоенному произведению задержки и полосы пропускания:
Размер буфера = 2 * задержка * полоса пропускания

Программа ping даст вам округленное время (round trip time - RTT) для сетевого соединения, 
что в два раза больше задержки. 
Формула принимает следующий вид:
Размер буфера = RTT * полоса пропускания
.08 секунд * 100 Мбс / 8 = 1 МБ

Пример:
cat  /etc/sysctl.conf
...
# увеличиваем максимальный размер буфера ТСР
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# увеличиваем ограничения автоподчтройки буфера ТСР Linux
# мин, по умолчанию, и максимальное число байт, которое можно использовать
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

Контроль перегрузки / рекомендуемый контроль перегрузки по умолчанию / recommended default congestion control

0. Проверить какие контроли перегрузки нам доступны:
sysctl net.ipv4.tcp_available_congestion_control
cat /proc/sys/net/ipv4/tcp_available_congestion_control

1. Проверить какие контроли перегрузки сейчас активны:
sysctl net.ipv4.tcp_congestion_control
cat /proc/sys/net/ipv4/tcp_congestion_control


2. Примеры включения:
Включить контроль перегрузки "cubic"без перезагрузки ОС.
sysctl -w net.ipv4.tcp_congestion_control=cubic

Включить очередь "fq" без перезагрузки ОС
sysctl -w net.core.default_qdisc=fq_codel
sysctl -w net.core.default_qdisc=fq


Пример добавления в файл /etc/sysctl.conf, контроль перегрузки bbr
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

BBR

BBR (Bottleneck Bandwidth and RTT) — алгоритма контроля перегрузки TCP, 
патчи с которым ещё в 2016 году были опубликованы компанией Google и приняты в основное ядро Linux. 
Применение этой технологии в некоторых случаях позволяет значительно увеличить пропускную способность канала передачи данных. 
Несколько тестов и информация по настройке BBR далее.
sysctl -w net.ipv4.tcp_slow_start_after_idle=0
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

В ядре требуется активировать:
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=y
CONFIG_NET_SCH_FQ=m