Джоб Снейдерс (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 по умолчанию и перевода алгоритма Нейгла в разряд отдельной включаемой опции.