Джоб Снейдерс (Job Snijders), известный разработчик OpenBSD, председатель одного из комитетов IETF (Internet Engineering Task Force), автор 11 RFC, связанных с маршрутизацией и RPKI, а также создатель IRRd (Internet Routing Registry Daemon), опубликовал серию патчей для OpenBSD, добавляющих новый sysctl-параметр «net.inet.tcp.nodelay» для отключения алгоритма Нейгла на уровне всей системы. Этот параметр освобождает разработчиков приложений от необходимости выставлять флаг TCP_NODELAY для отдельных сокетов.
Алгоритм Нейгла используется для агрегации мелких сообщений с целью снижения сетевого трафика. Он приостанавливает отправку новых TCP-сегментов до получения подтверждения о приеме ранее отправленных данных или до истечения таймаута. Например, если отправить 1 байт без агрегации, то дополнительно будет отправлено 40 байт каждого пакета с заголовками TCP и IP. При использовании алгоритма Нейгла сообщения, отправленные до получения подтверждения от удаленной стороны, накапливаются и отправляются одним пакетом. Из-за оптимизации «delayed ACK», задерживающей отправку ACK-пакетов, сигнал через пакеты с подтверждением фактически не работает, и отправка накопленных сообщений производится по истечении таймаута.
Снейдерс считает, что в современных условиях алгоритм Нейгла, который был разработан в эпоху, когда несколько пользователей конкурировали за полосу пропускания 1200 бод, устарел и в высокоскоростных сетях от него больше вреда, чем пользы. Недавно подобную точку зрения также высказал Марк Брукер (Marc Brooker) из Amazon Web Services (AWS). С доводами в пользу отключения алгоритма Нейгла по умолчанию можно ознакомиться в недавно опубликованной заметке.
Чтобы отключить алгоритм Нейгла, предусмотрена опция TCP_NODELAY, которая может быть установлена для отдельных сетевых сокетов. Режим TCP_NODELAY давно используется во многих приложениях OpenBSD, таких как openssh, httpd, iscsid, relayd, bgpd и unwind, и, по мнению Снейдерса, настало время предоставить возможность включения этой опции для всех TCP-сокетов на уровне всей системы. Снейдерс также предлагает обсудить возможность включения TCP_NODELAY по умолчанию и перевода алгоритма Нейгла в разряд отдельных опций для включения.
Източник: opennet.ru
