Как отключить алгоритм Nagle в Linux?

Есть ли способ сделать это через командную строку? man tcp говорит мне, что мне нужно установить tcp_nodelay = 1, но я не могу создать файл tcp_nodelay в /proc/sys/net/ipv 4. Пожалуйста, дайте мне знать, есть ли способ отключить Nagle в Linux.

Ответ 1

Этот флаг (TCP_NODELAY) - это опция, которая может быть включена для каждого сокета и применяется при создании сокета TCP. Это делается с определенной целью: алгоритм Nagle обычно полезен и помогает справляться с перегрузкой сети. Я сомневаюсь, что вы хотите отключить его в системе, так как ваша система, вероятно, пострадает от этой деактивации.

Чтобы отключить его для данного сокета, вы можете применить опцию TCP_NODELAY, как описано здесь и здесь в C:

int flag = 1;
int result = setsockopt(sock,            /* socket affected */
                        IPPROTO_TCP,     /* set option at TCP level */
                        TCP_NODELAY,     /* name of option */
                        (char *) &flag,  /* the cast is historical cruft */
                        sizeof(int));    /* length of option value */
 if (result < 0)
    ... handle the error ...

Возможно, вам придется адаптироваться к вашему языку программирования, но в основном он устанавливает флаг TCP_NODELAY в сокет sock, эффективно отключая алгоритм Nagle. Это справедливо для любой ОС с сокетами, поддерживающими стандарт TCP.

Если вы все еще хотите отключить алгоритм Нагле в рамках всей системы, доступны два варианта. Во-первых, вы можете перекомпилировать ваше ядро ​​с помощью соответствующего флага (см. Руководство по распространению для этого). Второй вариант - создать программное обеспечение, которое устанавливает флаг TCP_NODELAY для каждого существующего соединения, подобно этот код. Последний вариант должен выполняться каждый раз, когда в системе создается новое TCP-соединение.

Немного чище было бы активировать режим низкой латентности TCP:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency

Это даст подсказку стеку TCP о том, какие решения необходимо предпринять, чтобы снизить задержку (что, я думаю, это то, чего вы пытаетесь достичь, отключив алгоритм Нагле). По умолчанию он настроен на оптимизацию полосы пропускания ( "0" будет считаться с /proc/sys/net/ipv4/tcp_low_latency).