Назад | Перейти на главную страницу

Нормальное значение net.ipv4.tcp_max_syn_backlog в sysctl.conf

Я настраиваюсь sysctl.conf.

Согласно руководство по оптимизации на веб-сайте linode можно установить следующее разумное значение sysctl.conf:

net.ipv4.tcp_max_syn_backlog = 3240000

Однако такое же значение в руководстве по оптимизации Archlinux:

net.ipv4.tcp_max_syn_backlog = 65536

Наконец, на другом блог оптимизации (это старый, но все же SEO-специалисты довольно высоки в Google), ценность рекламируется следующим образом:

net.ipv4.tcp_max_syn_backlog = 4096

Все эти парки с мячом очень разные. В чем причина установки для этого значения большего числа (а не меньшего)? Какое из них должно быть фактическим «разумным» значением для начала?

В основном это зависит от того, какой объем трафика вы используете через сервер (ы). Есть несколько важных вопросов:

  • Сколько одновременных подключений вы планируете обрабатывать?
  • Какое среднее время ответа? (если генерация ответа занимает, например, 10-50 секунд, у вас могут легко закончиться ресурсы даже без DDoS-атаки).
  • Какой сервер вы используете? nginx, haproxy, varnish

Вы должны отслеживать:

netstat -s | grep "SYNs to LISTEN"

что является признаком того, что ваш сервер отбрасывает пакеты (например, потому что очередь невыполненных работ заполнена).

Статистика Netstat экспортируется в /proc/net/netstat где стат называется ListenDrops. Возможно, будет проще разобрать сценарий или использовать что-то вроде:

cat /proc/net/netstat | awk '(f==0) { i=1; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} \
    (f==1){ i=2; while ( i<=NF){ printf "%s = %d\n", n[i], $i; i++}; f=0}'

чтобы получить удобочитаемые названия статистики. Вы должны иметь возможность собирать эти данные, например, телеграф, собирать или Прометей.

Настройка ядра

net.ipv4.tcp_max_syn_backlog - Сколько полуоткрытых соединений, для которых клиент еще не отправил ответ ACK, может храниться в очереди (источник).

net.core.somaxconn Максимальное количество подключений, которые можно поставить в очередь на прием

net.core.netdev_max_backlog Максимальное количество пакетов в очереди приема, прошедших через сетевой интерфейс и ожидающих обработки ядром.

Эти настройки тесно связаны с количеством открытых файлов (так как в Linux каждое новое соединение будет открывать 2 дескриптора файлов). Вы можете проверить свои лимиты, используя:

cat /proc/sys/fs/file-nr
8160    0       3270712

Это означает, что на сервере 8160 открытые файлы из 3270712.