Поделиться через


Масштабирование приема, версия 2 (RSSv2)

Масштабирование на стороне получения повышает производительность системы, связанную с обработкой сетевых данных в многопроцессорных системах. NDIS 6.80 и более поздние версии поддерживают RSS версии 2 (RSSv2), которая расширяет RSS, предлагая динамическое распределение очередей на каждый VPort.

Обзор

По сравнению с RSSv1, RSSv2 сокращает время между измерением нагрузки ЦП и обновлением таблицы косвенного обращения, избегая замедлений в условиях высокой сетевой нагрузки. Для этого RSSv2 выполняет свои действия в IRQL = DISPATCH_LEVEL, в контексте обработки запроса и работает только с подмножеством записей таблицы косвенного обращения, указывающих на текущий процессор. Это означает, что RSSv2 может динамически распространять очереди приема по нескольким процессорам гораздо более отзывчиво, чем RSSv1.

Два OID-а, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 и OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, были введены в RSSv2 для минипортов драйверов, чтобы задать соответствующие возможности RSS и соответственно управлять таблицей косвенного обращения. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 — это обычный OID, а OID_GEN_RSS_SET_INDIRECTION_ENTRIES — синхронный OID, который не может возвращать NDIS_STATUS_PENDING. Дополнительные сведения об этих OID см. на отдельных справочных страницах. Дополнительные сведения о синхронных OID см. в разделе интерфейса запросов синхронных OID в NDIS 6.80.

Терминология RSSv2

В этой статье используются следующие термины:

Срок Определение
RSSv1 Механизм масштабирования на стороне приема первого поколения. Использует OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 В статье описан механизм масштабирования на принимающей стороне второго поколения, поддерживаемый в Windows 10, начиная с версии 1803 и выше.
Масштабируемая сущность Минипорт-адаптер сам в режиме Native RSS или VPort в режиме RSSv2.
ITE Запись косвенной таблицы (ITE) для заданной сущности масштабирования. Общее количество записей косвенной таблицы на VPort не может превышать NumberOfIndirectionTableEntriesPerNonDefaultPFVPort или NumberOfIndirectionTableEntriesForDefaultVPort в режиме VMQ или 128 в случае Native RSS. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort и NumberOfIndirectionTableEntriesForDefaultVPort являются членами структуры NDIS_NIC_SWITCH_CAPABILITIES.
Режим масштабирования Политика vmswitch на уровне VPort, которая контролирует обработку ITE во время выполнения. Это может быть статическим (не перемещается ITE из-за изменений нагрузки) или динамическим (расширение и объединение в зависимости от текущей нагрузки трафика).
Очередь Базовый аппаратный объект (очередь), который поддерживает ITE. В зависимости от аппаратного обеспечения и таблицы перенаправлений очередь конфигурации может поддерживать несколько ИТЭ. Общее количество очередей, включая ту, которая используется очередью по умолчанию, не может превышать предварительно настроенное ограничение, обычно заданное администратором.
Процессор по умолчанию Процессор, получающий пакеты, для которых хэш не может быть вычислен. Каждый VPort имеет процессор по умолчанию.
Основной процессор Процессор, указанный в качестве члена ProcessorAffinity структуры NDIS_NIC_SWITCH_VPORT_PARAMETERS при создании VPort. Этот процессор можно обновить во время выполнения и указать, где направляется трафик VMQ.
Исходный ЦП Процессор, с которым в настоящее время сопоставляется ITE.
Целевой ЦП Процессор, на который выполняется повторное переназначение ITE (с помощью RSSv2).
ЦП актера Обработчик, на котором выполняются запросы RSSv2.

Объявление возможностей RSSv2 в минипорт-драйвере

Мини-порты объявляют поддержку RSSv2, задав CapabilitiesFlags член структуры NDIS_RECEIVE_SCALE_CAPABILITIES с флагом NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Эта возможность необходима для включения функции балансировки нагрузки ЦП RSSv2, а также флага NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED, который обеспечивает динамическую балансировку RSSv1 для виртуальных портов не по умолчанию (VMQs).

Заметка

Протоколы верхнего уровня предполагают, что основной процессор VPort по умолчанию можно переместить для драйверов минипорта RSSv2.

Если мини-адаптер не объявляет возможности RSSv2, все виртуальные порты с поддержкой VMQ остаются в режиме статического распространения, даже если эти VPorts запрашиваются для динамического распространения. Идентификатор OID RSSv1 для настройки параметров RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, используется для VPorts, которые всё ещё находятся в режиме статического распределения.

Минипорт-драйверы должны реализовать только один механизм управления RSS — RSSv1 или RSSv2. Если драйвер объявляет поддержку RSSv2, NDIS преобразует RSSv1 OIDs в RSSv2 OIDs при необходимости для настройки распределения по виртуальным портам. Минипорт-драйвер должен поддерживать два новых OID и изменять поведение RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID следующим образом:

  • OID_GEN_RECEIVE_SCALE_PARAMETERS используется только для запросов в RSSv2, а не для задания параметров RSS.
  • OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 — это запрос и установка OID, используемая для настройки параметров сущности масштабирования, таких как количество очередей, количество ITEs, включение или отключение RSS и обновление хэш-ключей.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES — это метод OID, используемый для изменения записей таблицы переадресации.

Обработка RSSv2 OID

OID_GEN_RECEIVE_SCALE_PARAMETERS используется только для запроса текущих параметров RSS заданной сущности масштабирования. В RSSv1 этот OID используется для задания параметров. Для мини-портов с поддержкой RSSv2 NDIS автоматически выполняет это преобразование ролей для драйвера и выдает следующие два OID, чтобы задать параметры.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 является обычным OID и обрабатывается так же, как OID_GEN_RECEIVE_SCALE_PARAMETERS обрабатывался в RSSv1. Этот OID недоступен драйверам облегченных фильтров NDIS (LWFs) до NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, однако, является синхронной OID, которая не может возвращать NDIS_STATUS_PENDING. Этот OID должен быть выполнен и завершен в контексте процессора, в котором он был инициирован. Как и OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, он также не отображается для NDIS LWFs до NDIS 6.80. LWFs в NDIS 6.80 и более поздних версиях не допускают задержку данного идентификатора или переход на другой процессор. Его полезная нагрузка содержит массив простых действий «move ITE», каждое из которых содержит команду для перемещения одной ITE для масштабируемой сущности на другой целевой центральный процессор. Элементы массива могут ссылаться на различные сущности масштабирования (VPorts).

Каждый тип драйвера NDIS, минипорта, фильтра и протокола имеют точки входа для поддержки интерфейса запроса синхронного OID:

Тип драйвера NDIS Синхронные обработчики OID Функция для генерации синхронных OID
Минипорт MiniportSynchronousOidRequest N/A
Фильтр NdisFSynchronousOidRequest
Протокол N/A NdisSynchronousOidRequest

Переходы состояния RSS, обновления ITE и первичные или стандартные процессоры

Параметры управления

В RSSv2 разные параметры используются для передачи трафика в правильный ЦП в зависимости от состояния RSS (включена или отключена). Если RSS отключен, для направления трафика используется только основной процессор. Если RSS включен, обработчик по умолчанию и все ИТ-службы используются для направления трафика. Эти параметры управления обозначены как "активные" или "неактивные" в следующей таблице:

Параметр управления RSS отключен RSS включено
Основной процессор Активный Неактивный
Процессор по умолчанию Неактивный Активный
ITE[0..N] Неактивный Активный

Если параметр управления находится в активном состоянии, он направляет трафик. С момента перехода состояния RSS, который делает параметр неактивным, минипорт-драйверы должны отслеживать изменения параметра, пока обратный переход не активирует его снова. Это означает, что минипорт-драйверу необходимо отслеживать все обновления процессора по умолчанию и записи таблицы косвенного обращения, пока RSS отключен для этого объекта масштабирования. Если RSS включен, текущее отслеживаемое состояние процессора по умолчанию и таблицы косвенного обращения должно вступить в силу.

Например, рассмотрим сценарий, когда программное обеспечение vRSS уже включено. В этом случае таблица косвенного обращения уже существует в протоколе верхнего слоя и активно используется программным кодом распространения верхнего слоя. Если во время включения аппаратной поддержки RSS все записи начинают указывать на основной процессор до того, как обновления для переноса записей в таблице косвенных ссылок (перемещение) выдаются и выполняются оборудованием, основной процессор может столкнуться с кратковременной задержкой. Если минипорт-драйвер отслеживал процессор по умолчанию и информацию о ITE, он может направлять трафик туда, где его уже ожидает верхний уровень.

Хотя драйверы минипорта должны отслеживать все обновления неактивных параметров управления, они должны отложить проверку этих параметров до тех пор, пока изменение состояния RSS не попытается сделать эти параметры активными. Например, в случае распространения программного обеспечения во время отключения аппаратного RSS протоколы верхнего уровня могут использовать любой процессор для распространения (включая за пределами набора RSS адаптера). Верхние слои гарантируют, что на момент перехода состояния RSS все неактивные параметры допустимы для нового состояния RSS. Однако минипорт-драйвер по-прежнему должен проверить параметры и завершить переход состояния RSS, если он обнаруживает, что любые отслеживаемые неактивные параметров управления недопустимы.

Начальное состояние и обновления параметров управления

В следующей таблице описывается начальное состояние сущности масштабирования после создания (например, после создания VPort), а также способ обновления параметров:

Параметр Описание
Основной процессор
  • Инициализирован с процессором Affinity , указанным во время создания VPort.
  • Можно обновить с помощью OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID с набором флагов NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR.
  • Можно обновить с помощью OID_NIC_SWITCH_VPORT_PARAMETERS OID с набором флагов NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (это путь совместимости для существующих командлетов).
  • Можно прочитать с помощью OID_NIC_SWITCH_VPORT_PARAMETERS OID с флагом NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (это путь совместимости для существующих командлетов).
  • Действия после инициализации основного процессора не влияют на процессор по умолчанию или содержимое таблицы косвенного обращения.
Процессор по умолчанию
  • Инициализирован с помощью процессора сопоставления, указанного во время создания VPort.
  • Можно обновить с помощью OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID с установкой флага NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR.
Таблица косвенных ссылок
  • NumberOfIndirectionTableEntries имеет значение 1.
  • Единственная запись инициализирована с помощью процессора Affinity , указанного как во время создания VPort.
  • Обновление возможно с помощью OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID.

Обновления ИТ-служб и первичных или стандартных процессоров (с помощью OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) вызываются от процессора, к которому в данный момент указывает соответствующая запись. Для данного VPort верхний слой гарантирует, что в следующих случаях не будут выданы OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES для перемещения индексов таблицы или установки основных/стандартных процессоров:

  1. Пока OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 выполняется.
  2. После запуска последовательности удаления VPort. Например, верхний слой выдает команду OID для установки фильтра только после завершения последней команды OID, перемещающей интерфейсные элементы.

Отключение RSS

Во время отключения RSS протокол верхнего слоя может выбрать либо указать все ИТ-адреса на основной процессор, а затем выдать OID, чтобы отключить RSS, либо оставить таблицу косвенного обращения as-is и отключить RSS. В любом случае получаемый трафик должен быть направлен к основному процессору.

RSSv2 поддерживает требование из RSSv1, позволяющее протоколу верхнего слоя удалить VPort без первого отключения RSS. Верхний слой может установить фильтр приема в VPort на ноль, что гарантирует отсутствие трафика через VPort, а затем продолжить удаление VPort без отключения RSS. Верхний слой гарантирует, что OID'ы OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES не будут выданы во время или после удаления VPort.

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

Инварианты RSSv2

Протокол верхнего слоя гарантирует, что важные инварианты не нарушаются перед выполнением функций управления или перемещения ИТE. Например:

  1. Прежде чем уменьшить количество очередей, верхний слой должен убедиться, что таблица косвенной адресации не ссылается на большее количество процессоров, чем новое количество очередей для VPort.
  2. Верхний слой не должен запрашивать обновление непрямой таблицы, которое нарушает текущее настроенное количество очередей для VPort. Драйвер минипорта должен применять это правило и возвращать сбой.
  3. Перед изменением количества записей таблицы косвенного обращения для адаптеров VMMQ-RESTRICTED верхний слой гарантирует, что содержимое таблицы косвенного обращения нормализуется до 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

Параметр OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Синхронный интерфейс запроса OID в NDIS 6.80