...

Коалесцирование серверных прерываний и оптимизация работы сети: руководство по оптимизации

Коалесценция прерываний объединяет несколько входящих пакетов в одно аппаратное прерывание, снижая нагрузку на процессор и увеличивая пропускную способность. Я покажу, как настроить тайминги, пороговые значения и функции сетевой карты, такие как RSS и RSC, чтобы минимизировать задержку, дрожание и пропускная способность в зависимости от объема работы.

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

ОбзорСледующие основные аспекты структурированно проведут вас через технологию, настройку и практику.

  • Разгрузка процессораМеньше прерываний, выше пропускная способность.
  • Компромисс между задержкамиМиллисекунды против стабильности и pps.
  • Настройка сетевой картыПрофили энергопотребления RSS, RSC, MTU и BIOS.
  • Настройка ОСethtool, RSC/RSS, очереди драйверов.
  • Мониторингpps, interrupts/s, p99 latency.

Краткое описание коалесценции прерываний

Коалесцирующий означает, что сетевая карта собирает входящие пакеты и запускает прерывание только тогда, когда работы достаточно или истекает таймер. Таким образом, я значительно сокращаю количество прерываний и перемещаю часть обработка пакетов в сетевую карту, что снижает нагрузку на центральный процессор. На серверах Windows коалесцирование сегментов приема (Receive Segment Coalescing, RSC) помогает объединить несколько сегментов в более крупные блоки и снизить затраты на обработку. В Linux я управляю объединением через rx-usecs (время) и rx-frames (пакеты) в зависимости от характеристик потока и целевой задержки. Такой подход снижает накладные расходы, сохраняет ядра свободными и стабилизирует пропускную способность при большом трафике. Преднамеренный компромисс остается важным: каждая сводка добавляет небольшое время ожидания, которое я жестко ограничиваю для потоков, критичных к задержкам.

Механика: Тайминги, FIFO и пороговые значения

Сетевые карты хранить входящие кадры в очереди FIFO и запускать прерывания в соответствии с двумя критериями: после x полученных кадров или после y микросекунд. Я устанавливаю небольшие временные окна для сервисов с низкой задержкой и увеличиваю их для высокопроизводительных потоков с большими всплесками. Одна очередь на прием улучшает распараллеливание, а модерация прерываний уменьшает изменения в ядре и лучше использует кэш. Однако слишком высокие значения rx-usec увеличивают задержку; слишком низкие значения вызывают шторм прерываний и уменьшают объем кэша. Пропускная способность. Поэтому я балансирую таймаут и лимит пакетов в зависимости от MTU, размера кадра и доли маленьких пакетов.

Адаптивное модерирование и обнаружение всплесков

Адаптивная коалесценция динамически адаптирует временные и пакетные окна к текущей нагрузке. Я использую его, когда профили нагрузки сильно колеблются: при низкой скорости передачи данных окна остаются маленькими (низкая задержка); при увеличении скорости передачи данных они расширяются (снижается нагрузка на процессор). Преимущество зависит от драйвера: некоторые сетевые карты обнаруживают всплески и увеличивают rx-usecs по первому требованию, другие работают с фиксированными уровнями. Я проверяю Стабильность задержки p99 при активированной адаптации; нечеткие кривые указывают на слишком агрессивные скачки. Для детерминированных сервисов я предпочитаю устанавливать статические, точно подобранные пороги, а адаптивные режимы разрешаю использовать в массовом порядке, пока на кольце нет падений.

Пропускная способность и задержка: контролируемый компромисс

Латентность уменьшается, когда я отключаю коалесцирование, но тогда процессор работает значительно больше и хуже масштабируется под нагрузкой. Для передачи файлов, потокового вещания или репликации я допускаю некоторую задержку, поскольку это повышает стабильность и чистую пропускную способность. Для VoIP, игр в реальном времени или HFT я предпочитаю минимальные задержки и отключаю модерацию. Я также проверяю Управление перегрузками TCP, поскольку такие алгоритмы, как CUBIC или BBR, сильно влияют на поведение в случае потери пакетов, RTT и всплесков. При точной настройке таймеров, RSS и подходящих параметров TCP компромисс измеримая оптимизация.

Коалесцирование при передаче, TSO/GSO/GRO и LRO

В дополнение к RX, в Коалесцирование TX играют свою роль: tx-usecs и tx-frames связывают исходящие пакеты, что позволяет экономить контекстные переключения и стабилизировать пропускную способность. Я использую умеренные tx-usecs для сглаживания массовых отправлений, но держу их небольшими, если нужно быстро отправлять короткие ответы (например, HTTP API). Такие разгрузки, как TSO/GSO увеличивать сегменты перед передачей и уменьшать количество пакетов, в то время как GRO/LRO объединяю сегменты на стороне RX. Я проверяю, гармонируют ли GRO/LRO с моими промежуточными устройствами; для определенных брандмауэров или требований к захвату я уменьшаю LRO, чтобы границы пакетов оставались видимыми. В целом, я комбинирую коалесцирование TX и разгрузку таким образом, чтобы уменьшить PPS и чтобы ядро тратило меньше времени на SoftIRQ без излишнего увеличения времени отклика.

Настройка сетевой карты для хостинговых серверов

RSS (Receive-Side Scaling) распределяет входящие потоки по нескольким ядрам и не позволяет одному ядру стать тормозом. Я активирую RSS и устанавливаю достаточное количество очередей приема, чтобы многоядерные процессоры работали эффективно. RSC также снижает нагрузку за счет слияния более мелких сегментов, что уменьшает количество пакетов в стеке. Для хостинговых рабочих нагрузок я комбинирую коалесцинг с чистым выбором MTU, приоритизацией DSCP/QoS и профилями мощности процессора в BIOS, где C-состояния и режимы глубокого сна не увеличивают задержку. Я тестирую эти комбинации в пиковых нагрузках и проверяю, сохраняют ли IRQ affinity и queue pinning локальность кэша. Вот как я привожу хостинг для настройки ников и прервать коалесцирующую сеть.

NUMA, MSI-X и управление потоком

На многосокетных хостах я обращаю внимание на NUMA-Членство: я прикрепляю очереди приема к ядрам, расположенным близко к слоту PCIe, и размещаю связанные с ними рабочие потоки на том же узле NUMA. MSI-X-прерывания предлагают несколько векторов; я использую столько, сколько имеет смысл, чтобы у каждой очереди RX/TX было свое прерывание и уменьшалось время удержания блокировки. Кроме того, помощь RPS/RFS/XPS, чтобы направлять потоки на „нужные“ ядра и контролировать распределение отправлений. Я измеряю частоту пропусков L1/L2 и наблюдаю, увеличивается ли межъядерный трафик; если это так, я перераспределяю очереди или уменьшаю их количество, чтобы повысить локальность.

Параметры и их влияние (таблица)

Параметры такие как rx-usecs, rx-frames, очереди RSS и RSC, определяют, что я предпочитаю - минимизировать задержку или стабилизировать пропускную способность. Я начинаю с консервативных значений, измеряю задержки p99 и прерывания в секунду, а затем осторожно увеличиваю временные окна. Маленькие шаги облегчают определение эффектов и предотвращают неправильную интерпретацию. Если преобладают всплески, я немного увеличиваю rx-кадры и проверяю распределение джиттера. Для смешанных рабочих нагрузок я варьирую для каждого профиля VLAN или сетевой карты так, чтобы Потоки с разными целями оптимизируются отдельно.

Параметры Эффект Риск Подходит для
rx-usecs (время) CPU-Восстановление через окно задержки Больше задержек для коротких потоков Высокая пропускная способность, резервное копирование, репликация
rx-кадры (пакеты) Объединяет небольшие пакеты в один Прерывание вместе Заполнение киев для всплесков Множество мелких пакетов, веб-трафик
Очереди RSS Масштабная обработка в течение нескольких ядра Неправильная распиновка увеличивает межъядерный трафик Многоядерные хосты с пропускной способностью 10-100 Гбит/с
RSC/RSS активны Меньшая нагрузка на посылку в Стек Не подходит для сверхнизких задержек Хостинг, виртуализация, хранение данных

интерпретацияЕсли преобладают короткие потоки, я уменьшаю их влияние до минимума rx-usecs; для массовых передач я устанавливаю более высокие значения и получаю выгоду от снижения частоты прерываний. Я проверяю задержки p95/p99 и PPS после каждого шага, чтобы избежать неправильной конфигурации. По мере увеличения нагрузки я слежу за временем плавных IRQ и контекстными переключениями, чтобы убедиться, что процессорное время направляется туда, где оно приносит реальную пользу. Чистое распределение IRQ предотвращает блуждание прерываний между ядрами и экономит Кэш-хит.

Практика: Windows Server и Linux

WindowsВ диспетчере устройств я открываю свойства сетевой карты, выбираю „Дополнительно“ и настраиваю модерацию прерываний, RSS и RSC, если необходимо; для жестких низких задержек я устанавливаю модерацию на „Отключено“. Я устанавливаю профили питания на высокую производительность, чтобы C-состояния не увеличивали время отклика. LinuxЯ использую ethtool для настройки rx-usecs/rx-frames и ethtool -S для проверки счетчиков IRQ и ошибок; irqbalance или явное сродство (affinity pinning) распределяет очереди между ядрами. Для очень маленьких пакетов я экспериментирую с GRO/LRO и проверяю, является ли узким местом путь пользователя или путь ядра. Более подробно я рассказываю об этой теме в своем руководстве Оптимизация прерываний процессора, в котором описаны измеримые шаги и контрольные проверки.

Виртуализация и облако: SR-IOV, vSwitch и vRSS

В виртуализированных средах Путь пакетов оптимальные настройки. С SR-IOV VF обходят накладные расходы vSwitch; я настраиваю коалесценцию непосредственно на PF/VF и убеждаюсь, что политики гостя и хоста схожи. В сценариях vSwitch (Hyper-V, Open vSwitch) задействованы дополнительные очереди и планировщики; vRSS распределяет нагрузку внутри ВМ между несколькими vCPU. Я измеряю, где происходит коалесценция - на хосте или в ВМ, и предотвращаю двойную модерацию с помощью слишком больших окон. Для рабочих нагрузок NFV/DPDK работа смещается в пользовательское пространство; там я регулирую бюджеты опроса и сохраняю консервативный коалесцинг ядра, чтобы не фальсифицировать измерения.

Измерение производительности и телеметрия

Измерение обеспечивает каждую оптимизацию, поэтому я отслеживаю скорость передачи данных, байты/с, прерывания/с, время SoftIRQ, падения и длину очереди. Я сравниваю задержки p50/p95/p99 и обращаю внимание на поведение серий, поскольку средние значения маскируют резкие выбросы. Для HTTP/2/3 я измеряю плотность соединений, частоту запросов и процессорное время на запрос, чтобы распознать побочные эффекты коалесценции. Узлы хранения данных выигрывают, когда я смотрю на iowait, загрузку IRQ и сетевую задержку вместе, потому что узкие места имеют тенденцию мигрировать между уровнями стека. Приборные панели с событиями и временем развертывания помогают четко распределить шаги по настройке и немедленно остановить регрессии.

Критичные по времени протоколы и аппаратные метки времени

Для протоколов с точное измерение времени (например, PTP), я проверяю, влияет ли коалесценция на точность временных меток. Некоторые сетевые карты предлагают аппаратные временные метки, которые устанавливаются до коалесценции - идеальный вариант для точности измерений. В таких случаях я отключаю LRO/GRO и снижаю rx-usecs до минимума, чтобы варианты задержки не мешали синхронизации времени. Для детерминированных сетей (TSN) я поддерживаю энергосберегающие режимы, строго настраиваю QoS и убеждаюсь, что очереди не создают переполнений, которые угрожают стабильности часов.

Профили рабочей нагрузки: Когда активировать, а когда нет?

Высокая пропускная способностьРезервное копирование, создание CDN, хранение объектов и репликация виртуальных машин значительно выигрывают от коалесценции, поскольку процессор меньше беспокоится. веб-хостинг при большом количестве небольших запросов требуются умеренные значения в сочетании с RSS и хорошей локальностью кэша. Виртуальные среды выигрывают, если я устанавливаю разумные значения по умолчанию для каждой сетевой карты и изолирую шумных соседей. Для VoIP, игр или телеметрии в реальном времени я отключаю модерацию или устанавливаю очень жесткие таймеры. Измерения в соответствии с профилем трафика обязательны, поскольку массовый трафик 10 Гбит/с ведет себя иначе, чем API-трафик 1 Гбит/с.

Размеры колец, буферы и поведение при падении

В дополнение к таймерам Размеры колец (дескрипторы RX/TX) для обеспечения надежности во время всплесков. Я умеренно увеличиваю дескрипторы RX, когда короткие пики вызывают спады, обращая внимание на занимаемую память и пригодность кэша. Слишком большие кольца скрывают проблемы, но увеличивают время ожидания в конвейере. Я отслеживаю „rx_no_buffer“, „dropped“ и „overruns“ в счетчиках статистики и сравниваю пороговые значения с типичными длинами очередей. Тонко сбалансированная комбинация rx-кадров, rx-usecs и размера кольца предотвращает Взрывы приводят к потерям или пикам джиттера.

Обработка джиттера, потерь пакетов и пачек

Джиттер возникает при неблагоприятном взаимодействии окна коалесценции и шаблона всплеска; я могу распознать это по широкому распределению задержек. Небольшие скачки таймера часто сглаживают кривую p99 без заметного снижения пропускной способности. Если сетевая карта падает под нагрузкой, я устанавливаю менее агрессивные значения и проверяю глубину очереди и состояние драйверов. Для веб-сайтов полезно проанализировать Джиттер сети, чтобы сделать запросы на блокировку рендеринга и рукопожатия TLS планируемыми. Наконец, я проверяю, насколько чисто политики QoS разделяют классы приоритетов и таким образом предотвращают критические Потоки предпочитают.

Практический контрольный список по настройке

Начало с базовым уровнем: Я записываю латентность, pps, прерывания/с и профиль CPU перед каждым изменением. Затем я активирую RSS/RSC, устанавливаю умеренные значения коалесценции и снова измеряю p50/p95/p99. Затем я увеличиваю rx-usecs небольшими шагами, пока не увеличится джиттер или задержка p99, и откатываюсь к последней хорошей точке. Я назначаю очереди на фиксированные ядра и отслеживаю пропуски кэша; если кросс-ядерный трафик увеличивается, я корректирую привязку. Я кратко документирую каждое изменение и сравниваю пики нагрузки, чтобы Стабильность не страдает втайне.

Пример начальных значений в зависимости от скорости соединения

  • 1 Гбит/с: rx-usecs 25-50, rx-frames 8-16, tx-usecs 25-50; несколько очередей RSS (2-4), акцент на задержке.
  • 10 Гбит/с: rx-usecs 50-100, rx-frames 16-32, tx-usecs 50-100; 4-8 очередей RSS, GRO on, LRO selective.
  • 25/40 Гбит/с: rx-usecs 75-150, rx-кадры 32-64, tx-usecs 75-150; 8-16 сигналов, строгий пиннинг NUMA, активны RSC/RSS.
  • 100 Гбит/с: rx-usecs 100-200, rx-кадры 64-128, tx-usecs 100-200; 16-32 кия, полное использование MSI-X, умеренное увеличение размеров колец.

Подсказка: Это консервативные точки входа. Я оптимизирую по задержке и падениям p99 и учитываю размеры пакетов (MTU 1500 против Jumbo), сочетание потоков и топологию процессора.

Затраты, энергия и устойчивость

Энергия уменьшается, когда я нажимаю на частоту прерываний, потому что процессор выполняет меньше контекстных переключений и пробуждений. В центрах обработки данных это суммируется на многих узлах и заметно снижает затраты на питание и охлаждение. Переход на современные сетевые карты 10/25/40/100G с хорошей умеренностью обычно стоит несколько сотен евро, но часто быстро окупается за счет снижения времени работы процессора на байт. Я принимаю во внимание наличие лицензий, обслуживание драйверов и мониторинг, чтобы сохранить текущие расходы на низком уровне. Для сервисов, критичных к SLA, стоит использовать консервативное окно, которое Джиттер ограничивает и защищает возможности пользователя.

Поиск и устранение неисправностей

Показать метрики Штормы прерывания, Я уменьшаю очереди RSS или немного увеличиваю rx-usecs. Если кривые задержки „шатаются“, я отключаю адаптивную модерацию в качестве теста. Если падения происходят, несмотря на большой запас процессора, я проверяю размер кольца, версию прошивки и управление питанием состояния канала PCIe. Классика: очень высокая коалесценция + активные GRO/LRO маскируют потери пакетов в p50, в то время как p99 страдает - тогда я перебалансирую rx-кадры и сокращаю rx-usecs. На многопользовательских хостах „шумные соседи“ вызывают неравномерное распределение нагрузки на IRQ; я использую жесткие маски сродства и классы QoS, чтобы избежать критических IRQ. Потоки чтобы защитить их. Важно: всегда внедряйте изменения по отдельности и тестируйте их на идентичных профилях нагрузки, чтобы четко разделить причину и следствие.

Резюме: Быстрее, плавнее, предсказуемее

Основная идеяКоалесцирование прерываний уменьшает помехи, более разумно распределяет работу и увеличивает чистую пропускную способность при условии, что я целенаправленно устанавливаю таймеры и ограничения пакетов. Для высокопроизводительных сервисов я выбираю более щедрые окна, для сервисов реального времени я минимизирую или отключаю модерацию. Я полностью использую многоядерные процессоры с RSS, RSC, дисциплиной MTU и чистым сродством IRQ. Измерения p95/p99, прерываний/с и времени SoftIRQ подтверждают каждое изменение и предотвращают неверные интерпретации. Таким образом, мой Сеть Не шумит под нагрузкой, быстро реагирует и обеспечивает предсказуемые задержки для хостинга и приложений.

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

Коалесцирование серверных прерываний Оптимизация сети Графика
Серверы и виртуальные машины

Коалесцирование серверных прерываний и оптимизация работы сети: руководство по оптимизации

Коалесцирование серверных прерываний оптимизирует производительность сети: снижает нагрузку на процессор, увеличивает пропускную способность при обработке пакетов и настройке сетевых карт.

Фрагментация памяти при работе сервера, визуализированная фрагментированной оперативной памятью
Серверы и виртуальные машины

Фрагментация памяти при работе сервера: причины и решения

Фрагментация памяти при работе сервера: избегайте проблем с производительностью с помощью умных стратегий эффективного использования оперативной памяти.