Recevoir la mise à l’échelle côté version 2 (RSSv2)

La mise à l’échelle côté réception améliore les performances système liées à la gestion des données réseau sur les systèmes multiprocesseurs. NDIS 6.80 et versions ultérieures prennent en charge RSS version 2 (RSSv2), qui étend RSS en offrant une répartition dynamique par VPort des files d’attente.

Vue d’ensemble

Par rapport à RSSv1, RSSv2 réduit le temps entre la mesure de la charge du processeur et la mise à jour de la table d’indirection. Cela permet d’éviter le ralentissement en cas de trafic élevé. Pour ce faire, RSSv2 effectue ses actions à l’adresse IRQL = DISPATCH_LEVEL, dans le contexte de traitement de la demande, et fonctionne uniquement sur un sous-ensemble d’entrées de table d’indirection qui pointent vers le processeur actuel. Cela signifie que RSSv2 peut répartir dynamiquement les files d’attente de réception sur plusieurs processeurs de manière beaucoup plus réactive que RSSv1.

Deux OID, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 et OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, ont été introduits dans RSSv2 pour les pilotes miniports afin de définir les fonctionnalités RSS appropriées et de contrôler la table d’indirection respectivement. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 est un OID standard, tandis que OID_GEN_RSS_SET_INDIRECTION_ENTRIES est un OID synchrone qui ne peut pas retourner NDIS_STATUS_PENDING. Pour plus d’informations sur ces OID, consultez leurs pages de référence individuelles. Pour plus d’informations sur les OID synchrones, consultez Interface de requête OID synchrone dans NDIS 6.80.

Terminologie RSSv2

Cette rubrique utilise les termes suivants :

Terme Définition
RSSv1 Mécanisme de mise à l’échelle côté réception de première génération. Utilise OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Le mécanisme de mise à l’échelle côté réception de deuxième génération pris en charge dans Windows 10, version 1803 et ultérieure, décrit dans cette rubrique.
Entité de mise à l’échelle L’adaptateur miniport lui-même en mode RSS natif ou un VPort en mode RSSv2.
ITE Entrée de table d’indirection (ITE) d’une entité de mise à l’échelle donnée. Le nombre total d’ites par VPort ne peut pas dépasser NumberOfIndirectionTableEntriesPerNonDefaultPFVPort ou NumberOfIndirectionTableEntriesForDefaultVPort en mode VMQ ou 128 dans le cas RSS natif. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort et NumberOfIndirectionTableEntriesForDefaultVPort sont membres de la structure NDIS_NIC_SWITCH_CAPABILITIES .
Mode mise à l’échelle Stratégie de commutateur de machine virtuelle par VPort qui contrôle la façon dont ses ITE sont gérés au moment de l’exécution. Cela peut être statique (aucun déplacement d’ITE en raison de changements de charge) ou dyanmique (expansion et fusion en fonction de la charge actuelle du trafic).
File d'attente Objet matériel sous-jacent (file d’attente) qui sauvegarde un ITE. Selon le matériel et la table d’indirection, la file d’attente de configuration peut sauvegarder plusieurs ITE. Le nombre total de files d’attente, y compris celle utilisée par la file d’attente par défaut, ne peut pas dépasser la limite préconfigurée généralement définie par un administrateur.
Processeur par défaut Processeur qui reçoit des paquets pour lesquels le hachage ne peut pas être calculé. Chaque VPort a un processeur par défaut.
Processeur principal Processeur spécifié comme membre ProcessorAffinity de la structure NDIS_NIC_SWITCH_VPORT_PARAMETERS lors de la création de VPort. Ce processeur peut être mis à jour au moment de l’exécution et spécifie où le trafic VMQ est dirigé.
Processeur source Processeur auquel l’ITE est actuellement mappé.
UC cible Processeur auquel l’ITE est re mappé (à l’aide de RSSv2).
Processeur acteur Processeur sur lequel les requêtes RSSv2 sont effectuées.

Fonctionnalité RSSv2 publicitaire dans un pilote miniport

Les pilotes Miniport annoncent la prise en charge de RSSv2 en définissant le membre CapabilitiesFlags de la structure NDIS_RECEIVE_SCALE_CAPABILITIES avec l’indicateur NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE . Cette fonctionnalité est nécessaire pour activer la fonctionnalité d’équilibrage de charge du processeur de RSSv2, ainsi que l’indicateur NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED qui permet l’équilibrage dynamique RSSv1 pour les VPorts non par défaut (VMQs).

Notes

Les protocoles de couche supérieure supposent que le processeur principal du VPort par défaut peut être déplacé pour les pilotes miniport RSSv2.

Si un adaptateur miniport ne publie pas la fonctionnalité RSSv2, tous les VPorts avec VMQ restent en mode d’étalement statique même si ces VPorts sont demandés pour effectuer une diffusion dynamique. L’OID RSSv1 pour la configuration des paramètres RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, est utilisé pour ces VPorts qui sont toujours en mode d’étalement statique.

Les pilotes miniport n’ont besoin d’implémenter qu’un seul mécanisme de contrôle RSS : RSSv1 ou RSSv2. Si le pilote annonce la prise en charge de RSSv2, NDIS convertit les OID RSSv1 en OID RSSv2 si nécessaire pour configurer la propagation par VPort. Le pilote miniport doit prendre en charge les deux nouveaux OID et modifier le comportement du RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID comme suit :

  • OID_GEN_RECEIVE_SCALE_PARAMETERS est utilisé uniquement pour les requêtes dans RSSv2 et non pour définir des paramètres RSS.
  • OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 est une requête et un ensemble d’OID utilisés pour configurer les paramètres de l’entité de mise à l’échelle, tels que le nombre de files d’attente, le nombre d’EIT, l’activation/désactivation RSS et les mises à jour des clés de hachage.
  • OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES est un OID de méthode utilisé pour effectuer la modification des entrées de table d’indirection.

Gestion des OID RSSv2

OID_GEN_RECEIVE_SCALE_PARAMETERS est utilisé uniquement pour interroger les paramètres RSS actuels d’une entité de mise à l’échelle donnée. Dans RSSv1, cet OID est utilisé pour définir des paramètres. Pour les pilotes miniport compatibles RSSv2, NDIS effectue automatiquement cette conversion de rôle pour le pilote et émet les deux OID suivants pour définir les paramètres à la place.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 est un OID standard et est géré de la même façon que l’OID OID_GEN_RECEIVE_SCALE_PARAMETERS a été géré dans RSSv1. Cet OID n’est pas visible pour les pilotes de filtre léger (LWFs) NDIS antérieurs à NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, cependant, est un OID synchrone qui ne peut pas retourner NDIS_STATUS_PENDING. Cet OID doit être exécuté et terminé dans le contexte du processeur à l’origine de l’OID. Comme OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, il n’est pas non plus visible pour les LWFs NDIS antérieurs à NDIS 6.80. Les LWFs dans NDIS 6.80 et versions ultérieures ne sont pas autorisés à retarder cet OID ou à passer à un autre processeur. Sa charge utile contient un tableau d’actions « déplacer l’ITE » simples, chacune contenant une commande permettant de déplacer un seul ITE pour une entité de mise à l’échelle vers une autre uc cible. Les éléments du tableau peuvent référencer différentes entités de mise à l’échelle (VPorts).

Chaque type de pilote NDIS, miniport, filtre et protocole a des points d’entrée pour prendre en charge l’interface de requête OID synchrone :

Type de pilote NDIS Gestionnaire(s) OID synchrones Fonction à l’origine des OID synchrones
Miniport MiniportSynchronousOidRequest N/A
Filtrer NdisFSynchronousOidRequest
Protocol N/A NdisSynchronousOidRequest

Transitions d’état RSS, mises à jour ITE et processeurs principaux/par défaut

Paramètres de direction

Dans RSSv2, différents paramètres sont utilisés pour diriger le trafic vers le processeur approprié en fonction de l’état RSS (activé ou désactivé). Lorsque RSS est désactivé, seul le processeur principal est utilisé pour diriger le trafic. Lorsque RSS est activé, le processeur par défaut et tous les ITE sont utilisés pour diriger le trafic. Ces paramètres de direction sont étiquetés comme « actifs » ou « inactifs », résumés dans le tableau suivant :

Paramètre de direction RSS désactivé RSS activé
Processeur principal Actif Inactif
Processeur par défaut Inactif Actif
ITE[0..N] Inactif Actif

Lorsqu’un paramètre de direction est à l’état actif , il dirige le trafic. À partir du moment où une transition d’état RSS rend un paramètre inactif, les pilotes miniport doivent suivre les modifications apportées au paramètre jusqu’à ce que la transition inverse l’active à nouveau. Cela signifie qu’un pilote miniport doit suivre toutes les mises à jour des entrées de processeur et de table d’indirection par défaut, tandis que RSS est désactivé pour cette entité de mise à l’échelle. Lorsque RSS est activé, l’état suivi actuel du processeur par défaut et de la table d’indirection doit prendre effet.

Par exemple, considérez le scénario où le logiciel vRSS est déjà activé. Dans ce cas, la table d’indirection existe déjà dans le protocole de couche supérieure et est activement utilisée par le code de diffusion logicielle de la couche supérieure. Si, pendant l’activation du flux RSS matériel, toutes les entrées commencent à pointer vers le processeur principal avant que les mises à jour pour déplacer les entrées de table d’indirection soient émises et exécutées par le matériel, le processeur principal peut rencontrer un court blocage. Si le pilote miniport a suivi le processeur par défaut et les informations ITE, il peut diriger le trafic là où il est déjà attendu par la couche supérieure.

Notez que si les pilotes miniport doivent suivre toutes les mises à jour des paramètres de direction inactifs, ils doivent différer la validation de ces paramètres jusqu’à ce que le changement d’état RSS tente de rendre ces paramètres actifs. Par exemple, dans le cas d’une propagation logicielle alors que le flux RSS matériel est désactivé, les protocoles de couche supérieure peuvent utiliser n’importe quel processeur pour la propagation (y compris en dehors du jeu RSS de l’adaptateur). Les couches supérieures garantissent qu’au moment de la transition de l’état RSS, tous les paramètres inactifs sont valides pour le nouvel état RSS. Toutefois, le miniporteur doit toujours valider les paramètres et échouer la transition d’état RSS s’il découvre que tous les paramètres de direction inactifs suivis ne sont pas valides.

État initial et mises à jour des paramètres de direction

Le tableau suivant décrit l’état initial de l’entité de mise à l’échelle après la création (par exemple, après la création de VPort), ainsi que la façon dont les paramètres peuvent être mis à jour :

Paramètre Description
Processeur principal
  • Initialisé avec le processeur d’affinité spécifié lors de la création de VPort.
  • Peut être mis à jour à l’aide de l’OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES avec l’indicateur NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR défini.
  • Peut être mis à jour à l’aide de l’OID OID_NIC_SWITCH_VPORT_PARAMETERS avec l’indicateur NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED défini (il s’agit du chemin de compatibilité pour les applets de commande existantes).
  • Peut être lu à l’aide de l’OID OID_NIC_SWITCH_VPORT_PARAMETERS avec l’indicateur NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (il s’agit du chemin de compatibilité pour les applets de commande existantes).
  • Les déplacements post-initialisation du processeur principal n’affectent pas le processeur par défaut ou le contenu de la table d’indirection.
Processeur par défaut
  • Initialisé avec le processeur d’affinité spécifié lors de la création de VPort.
  • Peut être mis à jour à l’aide de l’OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES avec l’indicateur NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR défini.
Table d’indirection
  • NumberOfIndirectionTableEntries a la valeur 1.
  • La seule entrée est initialisée avec le processeur d’affinité spécifié lors de la création du VPort.
  • Peut être mis à jour à l’aide de l’OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES .

Mises à jour aux ITE et aux processeurs principaux/par défaut (à l’aide de OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) est appelé à partir du processeur vers lequel pointe actuellement l’entrée correspondante. Pour un VPort donné, la couche supérieure garantit qu’aucun OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID pour déplacer des ITE ou définir les processeurs principaux/par défaut ne sera émis dans les circonstances suivantes :

  1. Pendant OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 est en cours.
  2. Une fois la séquence de suppression VPort lancée. Par exemple, la couche supérieure émet l’OID de filtre défini uniquement une fois que le dernier OID pour déplacer les ITE est terminé.

Désactivation RSS

Pendant la désactivation RSS, le protocole de couche supérieure peut choisir de pointer tous les ITE vers le processeur principal, puis d’émettre l’OID pour désactiver RSS, ou il peut choisir de laisser la table d’indirection telle quelle et de désactiver RSS. Dans les deux cas, le trafic de réception doit cibler le processeur principal.

RSSv2 maintient une exigence de RSSv1 qui permet au protocole de couche supérieure de supprimer un VPort sans désactiver d’abord RSS. La couche supérieure peut définir le filtre de réception sur le VPort sur zéro, garantissant ainsi qu’aucun trafic de réception ne transite par le VPort, puis procéder à la suppression de VPort sans désactiver RSS. La couche supérieure garantit qu’aucun OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID ne sera émis pendant ou après la suppression de VPort.

Lors de la désactivation RSS et de la suppression de VPort, le pilote miniport doit prendre en charge toutes les opérations internes en attente qui peuvent exister en raison de déplacements de file d’attente précédents.

Invariants RSSv2

Le protocole de couche supérieure garantit que les invariants importants ne sont pas violés avant d’effectuer des fonctions de gestion ou des déplacements ITE. Par exemple :

  1. Avant de réduire le nombre de files d’attente, la couche supérieure garantit que la table d’indirection ne référence pas plus de processeurs que le nouveau nombre de files d’attente pour un VPort.
  2. La couche supérieure ne doit pas demander une mise à jour de table d’indirection qui enfreint le nombre de files d’attente actuellement configuré pour un VPort. Le pilote miniport doit l’appliquer et retourner un échec.
  3. Avant de modifier le nombre d’entrées de table d’indirection pour les adaptateurs VMMQ-RESTRICTED, la couche supérieure garantit que le contenu de la table d’indirection est normalisé à la puissance de 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Interface de requête OID synchrone dans NDIS 6.80