Оптимизация работы сетевого стека ОС Linux для высоконогруженных WEB серверов

На производительность nginx очень большое влияние имеет настройка ОС.

В данной статье затронуты некоторые очень важные аспекты настройки ОС Linux, в частности Ubuntu 12.04 для достижения максимальной производительности сетевой подсистемы.

Внесите следующие изменения в /etc/sysctl.conf, чтобы применить изменения выполните команду sysctl -p.

Увеличим длину очереди для входящих пакетов. Значение 30000 это нормальное значение даже для 10GigE, если у Вас входящий канал не превышает 1Gbit/s, то выставлять значение переменной netdev_max_backlog более 10000 не имеет смысла.

Сделать это можно внеся изменения в /etc/sysctl.conf, как уже говорилось:

или на ходу:

или так

Посмотреть текущее значение:

Далее увеличиваем количество возможных подключений к сокету аналогичным образом. По умолчанию значение равно 128, что при высоко нагруженном сервере будет являться узким местом.

Включаем tcp_syncookies, эта опция необходима для того, чтобы вы могли использовать параметрnet.ipv4.tcp_max_syn_backlog описанный ниже.

Увеличиваем буфер под хранение SYN запросов на соединение. Значение по умолчанию 1024, что очень мало для нагруженных серверов.

Увеличим возможное количество сокетов в состоянии TIME_WAIT

Разрешаем быструю утилизацию сокетов находящихся в состоянии TIME_WAIT

Включаем tcp_timestamps иначе не будет работать опция tcp_tw_reuse описанная ниже

Включаем механизм разрешающий использовать уже существующие сокеты, которые находятся в состоянии TIME_WAIT, если это не повредит безопасности.

Уменьшаем время пребывания сокета в состоянии FIN-WAIT-2

Уменьшаем временной интервал попытки определения жизнеспособности соединения. По умолчанию 7200, т.е. через 2 часа после того как через соединение прошел последний пакет, система пошлет keep-alive запрос, чтобы узнать состояние соединения. Уменьшим этот параметр до 30 минут (1800 сек).

Уменьшим количество посылок keepalive запросов и интервалов между запросами. По умолчанию делается 9 попыток с интервалом в 75 секунд, что в свою очередь займет 9*75=675 сек (11,25 минут), что в сочетании с параметром по умолчанию net.ipv4.tcp_keepalive_time = 7200 (7200 сек = 2 часа) дает нам значение 2 часа 11,25 минут — минимальное значение времени после которого соединение будет закрыто нашей стороной после прохождения через это соединение последнего пакета. Это очень большой интервал.
Устанавливаем 7 попыток с интервалом в 30 секунд:

Увеличиваем размеры буферов выделяемых под сетевые соединения.

Тут перечислены все параметры для удобства копирования в /etc/sysctl.conf:

Также Вам следует увеличить длину очереди для исходящих пакетов на каждом из сетевых интерфейсов. Делается это с помощью штатной команды ifconfig:

или

Для сохранения значения очереди после перезагрузки внесети изменения в /etc/rc.local до строчки exit 0:

или, как менее предпочтительный вариант, внести изменения в файл /etc/network/interfaces:

Получить данные о работе сетевых интерфесов можно с помошью команд:

Более подробно о сетевых параметрах, которые вы можете менять через sysctl можно прочесть Ipsysctl tutorial 1.0.4. Перевод находится здесь. А также описание некоторых sysctl переменных ядра Linux и здесь.

One thought on “Оптимизация работы сетевого стека ОС Linux для высоконогруженных WEB серверов

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.