...

Масштабирование TCP-окон сервера и оптимизация пропускной способности в центре обработки данных

Сервер TCP Масштабирование окна определяет полезную пропускную способность одного соединения в центрах обработки данных, особенно при высокой пропускной способности и двузначных значениях RTT. Я покажу, как я рассчитываю окно приема, динамически масштабирую его и использую целенаправленную настройку для минимизации узкого места между Размер окна и задержки.

Центральные пункты

Я кратко изложу наиболее важные положения, чтобы статья позволила быстро сориентироваться. Я сосредоточусь на размере окна, RTT, произведении пропускной способности на задержку и разумных параметрах системы. Каждое утверждение приносит прямые дивиденды в виде воспроизводимой пропускной способности данных. Я избегаю теории без ссылок и предлагаю конкретные шаги. Это создает четкий путь от диагностики к Тюнинг.

  • Масштабирование окон отменяет ограничение в 64 КБ и позволяет использовать большие окна.
  • RTT и размер окна определяют максимальную пропускную способность (≈ Window/RTT).
  • BDP показывает размер окна, необходимый для полного использования канала связи.
  • Буфер и автоматическая настройка стеков ОС обеспечивают реальную производительность.
  • Многопотоковые и параметры протокола увеличивают передачу данных.

Почему размер окна и RTT определяют пропускную способность

Я рассчитываю верхний предел на одно соединение по простой формуле Пропускная способность ≈ Окно/RTT. Окно размером 64 КБ и 50 мс RTT обеспечивают скорость около 10 Мбит/с, даже если оптоволоконный кабель позволяет передавать 1 Гбит/с. Это несоответствие особенно заметно на больших расстояниях и в глобальных сетях. Чем больше задержка, тем больше маленькое окно замедляет передачу. Поэтому я отдаю предпочтение достаточно большому размеру окна приема, а не просто покупаю полосу пропускания, которая остается неиспользованной. Таким образом я обращаюсь к фактическому регулировочному винту в стек TCP.

Пределы классического окна TCP

Оригинальное 16-битное окно ограничивает значение 65 535 байтами и, таким образом, устанавливает жесткий предел для пропускная способность при высоком RTT. В локальной сети это редко заметно, но на континентах скорость резко падает до однозначных или низких двузначных значений Мбит/с. Пример наглядно показывает это: 64 КБ при 100 мс RTT дают всего около 5 Мбит/с. Этого недостаточно для резервного копирования, репликации или передачи больших файлов. Я решаю эту проблему, последовательно применяя масштабирование окна. активировать и проверьте переговоры.

Как работает масштабирование окна TCP

С возможностью Оконная шкала Я увеличиваю логическое окно с помощью экспоненты (0-14), которая согласовывается во время рукопожатия SYN. Эффективное окно получается из Header-Window × 2^Scale и, таким образом, может увеличиваться до размеров, достигающих гигабайта. Очень важно, чтобы обе конечные точки принимали эту опцию и чтобы ни один промежуточный компонент не фильтровал ее. Я проверяю рукопожатие в Wireshark и обращаю внимание на опцию в SYN и SYN/ACK. Если она отсутствует, соединение возвращается к 64 КБ, что означает Пропускная способность ограничено немедленно.

Динамические размеры окон в современных системах

Современные ядра Linux и серверы Windows адаптируют RWIN динамически и при благоприятных условиях вырастает до нескольких мегабайт. В Linux я управляю поведением через net.ipv4.tcp_rmem, net.ipv4.tcp_wmem и net.ipv4.tcp_window_scaling. В Windows я проверяю с помощью netsh int tcp show global, активна ли автонастройка. Я слежу за тем, чтобы с обеих сторон было достаточно буферов, чтобы рост не останавливался на максимальных значениях. Так я использую преимущества автоматического масштабирования в Продуктивная работа от.

Правильно оцените BDP: Какого размера должно быть окно?

Произведение задержек в полосе пропускания (BDP) дает мне целевое значение для окна TCP: Bandwidth × RTT. Я устанавливаю окно приема не менее этого значения, чтобы использовать линию. Без достаточного буфера соединение не будет соответствовать номинальной пропускной способности. В следующей таблице показаны типичные комбинации RTT и пропускной способности с требуемыми размерами окна и ограничением в 64 КБ. Это позволяет мне сразу увидеть, насколько сильно может быть использовано маленькое окно WAN-Дистанционные тормоза.

RTT Полоса пропускания BDP (МБит) Минимальное окно (МБ) Пропускная способность с 64 КБ
20 мс 1 Гбит/с 20 ≈ 2,5 ≈ 26 Мбит/с
50 мс 1 Гбит/с 50 ≈ 6,25 ≈ 10 Мбит/с
100 мс 1 Гбит/с 100 ≈ 12,5 ≈ 5 Мбит/с
50 мс 10 Гбит/с 500 ≈ 62,5 ≈ 10 Мбит/с

Практический тюнинг: от измерения до настройки

Я начинаю с измерений: пинг и traceroute предоставить RTT, iperf3 измеряет скорости на входе и выходе и Wireshark показывает согласованные Масштабирование в рукопожатии. Если окно в трассировке остается на уровне 64 КБ, я ищу устройства, которые фильтруют или изменяют параметры. Я проверяю брандмауэры, VPN-шлюзы и балансировщики нагрузки на соответствие RFC1323. Если переговоры подходят, я проверяю ограничения буфера и максимальные пределы автонастройки ОС. Я также оцениваю выбор алгоритма управления перегрузками, поскольку его реакция на потери и задержку совпадает с реальной. Пропускная способность Подробности изложены в статье Управление перегрузками TCP вместе.

Разумно выбирайте буферы приема и отправки

Я определяю размер буфера на основе BDP и установите максимальные значения щедро, но контролируемо. В Linux я настраиваю net.ipv4.tcp_rmem и net.ipv4.tcp_wmem (минимум/ошибка/максимум в каждом случае) и оставляю запас для больших расстояний. В Windows я проверяю уровни автонастройки и документирую изменения в стеке TCP. Важно: Большие буферы требуют оперативной памяти, поэтому я оцениваю количество и тип моих высоконагруженных соединений. Более подробную информацию и примеры правильного выбора буфера я привожу в статье Настройка буфера сокета, что делает взаимосвязь между буферами, RWIN и задержкой ощутимой.

Распараллеливание: целенаправленное использование нескольких потоков TCP

Даже при наличии большого окна я часто добиваюсь большего на практике, если использую несколько потоки параллельно. Многие инструменты резервного копирования, загрузчики или решения для синхронизации уже делают это по умолчанию. Параллелизация позволяет мне обойти ограничения на количество подключений в промежуточных узлах и сгладить колебания отдельных потоков. Я сегментирую передачи по файлам или блокам и определяю разумные значения параллелизма. Это позволяет мне распределить риски и получить дополнительные процентные пункты Полоса пропускания выходить.

Тонкая настройка на уровне протоколов и приложений

Не все программы используют большие Windows эффективным, поскольку дополнительные подтверждения или малый размер блока замедляют передачу данных. Я увеличиваю размер блока, активирую конвейеризацию и настраиваю параллельные запросы, если приложение это позволяет. Современные версии SMB, актуальные стеки HTTP и оптимизированные механизмы резервного копирования заметно выигрывают от этого. Я также проверяю TLS-разгрузку, MSS-зажим и jumbo-кадры, если вся цепочка поддерживает их должным образом. Эти настройки дополняют масштабирование окон и повышают реальную Пропускная способность Вперёд.

Понимание автонастройки: Пределы, эвристика и разумные значения по умолчанию

Автоматическая настройка не является гарантией успеха. В Linux, помимо tcp_rmem/tcp_wmem прежде всего net.core.rmem_max и net.core.wmem_max верхний предел для одного сокета. Такие значения, как 64-256 МБ, рекомендуются для передачи данных по глобальной сети с высоким BDP-требования общие. Я активирую net.ipv4.tcp_moderate_rcvbuf=1, чтобы ядро постепенно загружало окно приема, и проверьте net.ipv4.tcp_adv_win_scale, который определяет, насколько активно свободные буферы преобразуются в размер окна. tcp_timestamps и SACK Я держу их активными, так как они делают ретрансляцию целенаправленной и незаменимы при больших окнах.

В Windows я наблюдаю такое поведение при netsh int tcp show global и netsh int tcp show heuristics. Обычно я устанавливаю уровень настройки автомобиля на нормальный и деактивировать эвристику, которая излишне ограничивает рост окна для путей, признанных „медленными ссылками“. Важно в обоих мирах: Приложения, которые явно SO_RCVBUF/SO_SNDBUF может эффективно замедлить автонастройку. Поэтому я проверяю серверные процессы (например, прокси, демоны передачи) на наличие таких переопределений и настраиваю их соответствующим образом.

Анализ трассировки: что я проверяю в рукопожатии и потоке данных

В Wireshark я проверяю в SYN/SYN-ACK рядом с Оконная шкала также SACK Разрешено, Временные метки и MSS. В потоке данных я смотрю на „Bytes in flight“, „TCP Window Size value“ и „Calculated Window Size“. Если рассчитанное окно остается неизменным, несмотря на высокое значение rmem плоские, блокирующие ограничения или приложение является ограниченное применение. Я также использую графики TCP-потока (временная последовательность, масштабирование окна), чтобы увидеть, растет ли окно динамически и отменяют ли ретрансляции или пакеты, идущие не по порядку, этот эффект.

MTU, MSS и джамбо-фреймы: сколько они приносят на самом деле

Большие окна эффективны только при эффективном заполнении канала. Поэтому я проверяю эффективное MTU на всем пути. С помощью ip-ссылка и ethtool Я признаю местные ограничения, с ping -M do -s Я тестирую Path-MTU. Если PMTUD не работает, я активирую его в Linux. net.ipv4.tcp_mtu_probing=1 или установите разумное ограничение MSS на граничных устройствах, чтобы избежать фрагментации. Кадры Jumbo (9000) целесообразно использовать в однородно сконфигурированной сети, чтобы снизить нагрузку на процессор и увеличить Goodput. В отличие от этого, я отдаю предпочтение чистому PMTUD и согласованным значениям MSS перед необработанным увеличением MTU через гетерогенные или WAN-сегменты пути.

Потери, ECN и управление очередями

При больших окнах даже небольших потерь пакетов достаточно, чтобы сильно снизить реальную пропускную способность. Поэтому я активно проверяю, поддерживается ли ECN и не очищается ли она на всем пути, и комбинирую это с AQM (например, FQ-CoDel) на пограничных интерфейсах. Это снижает Задержка в очереди и предотвращает размывание буфера, не делая окно искусственно маленьким. В Linux современные детекторы потерь, такие как RACK/TLP, помогают мне быстрее закрывать хвосты. В средах с частыми всплесками я полагаюсь на управление перегрузками с поддержкой темпа (например, CUBIC с ограничением очереди байтов или BBR), но все равно слежу за тем, чтобы окно приема было достаточно большим - даже BBR не может обеспечить работу без достаточного RWIN.

Вид сервера и приложения: осознанное использование опций сокета

Многие серверные процессы жестко устанавливают размеры буферов и тем самым ограничивают рост. Я явно проверяю начальное и пиковое значения с помощью сс -ти (Linux) и наблюдайте skmem/rcv_space. На уровне приложения я настраиваю размеры блоков и записей, отключаю Nagle (TCP_NODELAY) только в тех случаях, когда задержка на сообщение более важна, чем пропускная способность, и уменьшить эффект отложенного ACK за счет использования больших единиц передачи. Для передачи файлов я использую sendfile() или механизмы нулевого копирования и асинхронный ввод-вывод, чтобы пользовательское пространство не стало узким местом.

Масштабирование до 10/25/40/100G: процессор, разгрузка и многопотоковая очередь

Для больших окон требуется хост. Я слежу за тем, чтобы TSO/GSO и GRO/LRO были активны, чтобы система эффективно обрабатывала большие сегменты. Я использую RSS/Multiqueue для распределения потоков между несколькими ядрами, настраиваю сродство IRQ для топологий NUMA и слежу за нагрузкой SoftIRQ. На стороне устройства я настраиваю кольцевые буферы и коалесцирование прерываний, чтобы хост не сталкивался со штормами прерываний. Все это гарантирует, что масштабирование окон не даст сбой из-за ограничений процессора и что достигнутые скорости останутся воспроизводимыми.

Пошаговый путь: От целевой ставки до конфигурации

  • Определите цель: желаемую пропускную способность и измеренный RTT (например, 5 Гбит/с при 40 мс).
  • BDP Рассчитать: 5 Гбит/с × 0,04 с = 200 Мбит ≈ 25 МБ окна.
  • Установите ограничения для Linux: sysctl -w net.core.rmem_max=268435456, net.core.wmem_max=268435456, net.ipv4.tcp_rmem="4096 87380 268435456", net.ipv4.tcp_wmem="4096 65536 268435456", net.ipv4.tcp_moderate_rcvbuf=1.
  • Проверьте Windows: netsh int tcp show global; Тюнинг автомобилей нормальный, а не эвристика дросселирования.
  • Проверка рукопожатия: Wireshark - Window Scale, MSS, SACK/Timestamps доступны.
  • Безопасные MTU/MSS: функционирование PMTUD или зажатие MSS на пути.
  • Установите управление перегрузками и AQM: CUBIC/BBR в соответствии с профилем; ECN/AQM активны на границе.
  • С iperf3 проверять: Одно- и многопоточные (-P), с/без TLS/приложения.
  • Проверьте буфер приложения: он не маленький SO_RCVBUF/SO_SNDBUF установить, увеличить размер блока.

Типичные подводные камни и быстрая проверка

Я часто сталкиваюсь с брандмауэрами или маршрутизаторами, которые Опции в заголовке TCP или отбрасывать их. Асимметричные пути усугубляют проблему, поскольку исходящий и обратный пути проходят через разные политики. Агрессивная нормализация TCP в маршрутизаторах доступа также разрушает корректное согласование. Слишком жесткие буферы и таймауты приводят к длительным фазам восстановления в случае потерь. Я тестирую изменения в изолированных окнах, наблюдаю за ретрансляциями и шаг за шагом вношу коррективы, чтобы Стабильность сохраняется.

Контекст хостинга и центров обработки данных

В продуктивных системах многие клиенты используют один и тот же Инфраструктура, Эффективное использование каждого соединения имеет значение. Я получаю преимущества от топологий типа "лист-спина", коротких путей с востока на запад и достаточного количества восходящих каналов. Современные алгоритмы контроля перегрузок, чистое управление очередями и надежные правила QoS делают результаты воспроизводимыми. Я планирую размеры окон и буферов с учетом пиковых нагрузок и параллельных сессий. Это позволяет поддерживать постоянную производительность и минимизировать влияние Масштабирование окон прибывает на все службы.

Мониторинг и постоянная оптимизация

Я регулярно провожу измерения с помощью iperf3 между локациями, отслеживать RTT, джиттер, ретрансляции и Goodput. Данные о потоке и sFlow/NetFlow помогают мне своевременно распознавать закономерности в трафике. В случае возникновения провалов я проверяю потери пакетов, так как даже низкие показатели сильно снижают пропускную способность; о том, как я эффективно справляюсь с этой проблемой, я рассказываю в статье Анализ потери пакетов вместе. Я использую приборные панели временных рядов, чтобы сразу были видны переломы тенденций. Это означает, что моя настройка остается эффективной и я могу реагировать на изменения в путях, политиках или профилях нагрузки до того, как они произойдут. Пользователи почувствуйте это.

Краткое резюме из практики

Большие окна через Масштабирование окон, Правильные буферы и правильно согласованное рукопожатие ставят рычаг в нужное место. Я рассчитываю BDP, измеряю реальный RTT и устанавливаю максимальные значения, чтобы автонастройка могла расти. Затем я проверяю параметры протокола и при необходимости использую распараллеливание. Если пропускная способность не соответствует ожиданиям, я ищу промежуточные устройства, которые фильтруют параметры и оптимизируют управление перегрузками, включая поведение очередей. Таким образом я использую доступные Полоса пропускания даже в дальних поездках и избавит меня от дорогостоящих обновлений оборудования, которые не решают проблему узкого места.

Текущие статьи

Центр обработки данных с современными стоечными серверами и сетевыми кабелями для оптимизации пропускной способности TCP
Серверы и виртуальные машины

Масштабирование TCP-окон сервера и оптимизация пропускной способности в центре обработки данных

Узнайте, как работают вместе Server TCP Window Scaling, Bandwidth-Delay-Product и Network Tuning и как вы можете оптимизировать пропускную способность своих соединений с помощью ключевого слова Server TCP Window Scaling.

Разработчик работает над прогрессивным веб-приложением с рабочим сервисом и настройкой хостинга
Технология

Веб-хостинг для прогрессивных веб-приложений: правильное развертывание рабочих служб

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

Серверная комната с монитором, на котором отображается план выполнения SQL
Базы данных

Анализ и оптимизация планов выполнения запросов к базам данных в хостинге

Узнайте, как провести целенаправленную sql-оптимизацию с помощью плана выполнения запросов на хостинге, использовать mysql explain hosting и тем самым стабильно повышать производительность вашей базы данных.