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

Почему некоторые tcp_ [rw]? Mem $ voodoo показывают все равные значения?

Глядя на руководства по оптимизации TCP в Интернете, общей темой является установка трехцелочисленного вектора tcp_mem, tcp_rmem или tcp_wmem на равные значения в файле sysctl.conf.

Заимствуя из страницы руководства TCP, функция значений описывается следующим образом:

низкий

давление

высокая

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

Может ли кто-нибудь более умный, чем я, относительно памяти TCP в ядре Linux рассказать о последствиях установки этих значений равными?

Вы правы, многие люди понятия не имеют, о чем они говорят, и не думают самостоятельно, поэтому они просто создают карго-культовые настройки из других источников, не понимая, что эти настройки делают или истинного значения настроек.

Очевидно, вы не из таких людей. Проголосуйте!

Установка всех трех значений tcp_.mem настройки на одно и то же нарушили бы способность TCP автоматически настраивать размеры буфера и использование памяти ( net.ipv4.tcp_moderate_rcvbuf=1 tunable), что является хорошим преимуществом реализации TCP в Linux.

Если предположить, что все значения были высокими, это было бы неэффективным использованием памяти TCP.

Если было создано достаточно розеток, потолки, определяемые net.ipv4.tcp_mem попадают (обратите внимание, что они измеряются в страницы, а не байты), тогда TCP будет более неэффективным, поскольку он начнет сворачивать буферы вместе, чтобы уменьшить использование памяти, что приведет к увеличению %sys Использование ЦП, чем действительно требуется.

Если нехватка памяти была достаточной, ядро ​​начало отбрасывать пакеты сначала из очереди не по порядку, а затем из основной очереди приема.

Правильное значение для tcp_rmem tunables это:

  • низкий: 4 КБ или 8 КБ (одна или две страницы, если не x86)
  • по умолчанию: BDP вашего наиболее часто обслуживаемого соединения
  • high: какое-то значение больше значения по умолчанию, что позволяет выполнять массовые передачи и задержку, которую приложение имеет при чтении из буфера сокета.

Для 1 Гбит / с обычно достаточно 4–6 МБ. Для 10 Гбит / с вы можете увеличить до 16 Мб. Я не видел системы, которая была бы полезной выше, но, возможно, такая система существует.

Обычно вы можете оставить tcp_wmem перестраиваемые как есть.

Чем дольше система работает и обслуживает сетевые соединения, тем лучше автоматическая настройка TCP позволяет прогнозировать идеальный размер буфера по умолчанию на основе BDP и RTT предыдущих подключений.