Масштабирование на стороне приема NetAdapterCx (RSS)

Масштабирование на стороне приема (RSS) — это технология сетевого драйвера, которая обеспечивает эффективное распределение обработки приема по сети между несколькими ЦП в многопроцессорных системах. RSS повышает производительность системы и повышает масштабируемость сети, используя все доступные процессоры в системе и динамически перебалансируя рабочие нагрузки ЦП.

В этом разделе рассматриваются клиентские драйверы RSS для NetAdapterCx и предполагается знание понятий и терминологии RSS. Дополнительные сведения о RSS в целом, включая схемы, иллюстрирующие RSS в различных аппаратных сценариях, см. в разделе Масштабирование на стороне приема.

Обзор RSS в NetAdapterCx

RSS в NetAdapterCx фокусируется на простоте настройки, простоте включения и отключения, а также абстракции сложности процессора и прерывания. Драйвер клиента для сетевого адаптера с поддержкой RSS должен соответствовать только трем критериям для поддержки RSS в NetAdapterCx:

  1. Драйвер должен задать возможности RSS при запуске сетевого адаптера, но перед вызовом NetAdapterStart. Сюда входит реализация четырех обратных вызовов RSS и их регистрация в структуре возможностей RSS.
  2. Очереди пути к данным драйвера должны быть созданы и готовы к приему запросов.
  3. Драйвер должен находиться в состоянии питания D0 .

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

Позже, когда драйвер выгружается, NetAdapterCx не будет вызывать обратные вызовы RSS после того, как очереди пути к данным были уничтожены во время последовательности выключения питания. Так как очереди пути к данным удаляются в качестве первого шага во время выключения питания, это означает, что клиентам не нужно обрабатывать возможные события RSS на любом другом этапе во время выключения питания.

Настройка возможностей RSS

Чтобы приступить к работе с RSS в NetAdapterCx, выполните следующие действия:

  1. При запуске сетевого адаптера сообщите системе о возможностях и ограничениях RSS вашего оборудования, используя структуру NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES .
  2. Инициализируйте структуру возможностей, вызвав NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT.
  3. При инициализации структуры возможностей RSS задайте элементы обратного вызова RSS структуры, чтобы зарегистрировать реализации для этих обратных вызовов:
    1. EvtNetAdapterReceiveScalingEnable
    2. EvtNetAdapterReceiveScalingDisable
    3. EvtNetAdapterReceiveScalingSetHashSecretKey
    4. EvtNetAdapterReceiveScalingSetIndirectionEntries
  4. Задайте для структуры возможностей RSS значение SynchronizeSetIndirectionEntries соответствующим образом.
  5. Передайте инициализированные структуры возможностей RSS в метод NetAdapterSetReceiveScalingCapabilities .

Включение и отключение RSS

После настройки возможностей RSS система продолжит работу с последовательностью включения питания для драйвера. NetAdapterCx начинает вызывать обратные вызовы RSS драйвера после завершения последнего шага создания очередей пути к данным. На этом этапе RSS можно включить и отключить по мере необходимости в системе.

Важно!

Не следует очищать или сбрасывать таблицу косвенного обращения при включении или отключении RSS. Платформа задаст исходное состояние таблицы косвенного обращения.

Включение RSS

NetAdapterCx включает RSS, вызывая обратный вызов EvtNetAdapterReceiveScalingEnable драйвера. В контексте этого обратного вызова вы обычно включаете биты управления на оборудовании.

Пример кода включения RSS см. в разделе EvtNetAdapterReceiveScalingEnable.

Отключение RSS

NetAdapterCx отключает RSS, вызывая обратный вызов EvtNetAdapterReceiveScalingDisable драйвера. Здесь обычно отключается бит управления на оборудовании, который вы ранее задали в EvtNetAdapterReceiveScalingEnable.

Пример кода отключения RSS см. в разделе EvtNetAdapterReceiveScalingDisable.

Установка хэш-секретного ключа

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

Пример кода для задания секретного ключа хэша см. в разделе EvtNetAdapterReceiveScalingSetHashSecretKey.

Перемещение записей таблицы косвенного обращения

Пока RSS работает в системе, драйверы протокола верхнего уровня отслеживают рабочую нагрузку процессора и поддерживают таблицу косвенного обращения, которая сопоставляет очереди приема с процессорами. Когда драйверу протокола необходимо перераспреждать рабочую нагрузку процессора в RSS, он сначала вычисляет новое сопоставление для каждой записи таблицы косвенного обращения с новым процессором. Затем протокол передает эти сведения в NetAdapterCx, который обрабатывает сложность сопоставления очередей приема и векторов аппаратных прерываний с правильным процессором от имени драйвера клиента сетевой карты. NetAdapterCx сохраняет новую таблицу косвенного обращения с записями, сопоставленными с идентификаторами очередей получения, в NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES структуре и передает ее драйверу при вызове функции обратного вызова EvtNetAdapterReceiveScalingSetIndirectionEntries .

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

Метод назначения записей индекса очередям получения оборудования зависит от структуры сетевого адаптера и количества очередей получения. Дополнительные сведения и пример кода см. в разделе EvtNetAdapterReceiveScalingSetIndirectionEntries.

Поддержка разнородных ЦП

Важно!

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

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

Начиная с предварительной версии WDK 25197, NetAdapterCx обеспечивает поддержку разнородных систем ЦП за счет эффективного использования различных типов ядер. Во время работы RSS система решает, какой процессор использовать в зависимости от рабочей нагрузки трафика, полученного драйвером клиента. При получении меньшего объема трафика его могут обрабатывать меньшие и более энергоэффективные ядра. Если трафик больше, для непрерывного опроса получаемых пакетов требуются ядра большего размера и производительности.

Чтобы согласиться на поддержку разнородных систем, системный администратор должен задать для ключевого слова *RSSProfileстандартизированного INF значениеNdisRssProfileBalanced. Это профиль по умолчанию для разнородных систем. Чтобы позволить системе выбирать лучшие ядра для использования, нельзя задать расширенные ключевые слова RSS.

Другие профили RSS также поддерживаются для разнородных систем. Если вы хотите управлять дополнительными параметрами, такими как базовый номер процессора RSS и максимальный номер процессора RSS в системе, следует использовать другой профиль RSS.

Вы также можете использовать NdisRssProfileBalanced в однородной системе ЦП. В этом случае система решает, какие процессоры следует использовать для RSS.