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

Минипорт-драйверы должны реализовать только один механизм управления 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 — это запрос и идентификатор набора, используемый для настройки параметров масштабируемой сущности, таких как количество очередей, количество ИТ-адресов, включение или отключение RSS и обновления хэш-ключей.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES — это метод OID, используемый для изменения записей таблицы косвенного обращения.

Обработка OID RSSv2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметр Описание
Основной процессор
Процессор по умолчанию
  • Инициализирован с помощью процессора Affinity, указанного во время создания 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 OID для перемещения ИТ-объектов или установки основных или стандартных процессоров будут выданы в следующих случаях:

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

Отключение RSS

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

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