Delen via


Ontvangstzijde Schalen versie 2 (RSSv2)

Receive Side Scaling verbetert de systeemprestaties met betrekking tot de verwerking van netwerkgegevens op multiprocessorsystemen. NDIS 6.80 en hoger ondersteunen RSS-versie 2 (RSSv2), dat RSS uitbreidt door dynamische, per-VPort-verspreiding van wachtrijen aan te bieden.

Overzicht

Vergeleken met RSSv1 verkort RSSv2 de tijd tussen de meting van de CPU-belasting en het bijwerken van de indirectietabel, waardoor vertraging tijdens situaties met veel verkeer wordt voorkomen. Hiervoor voert RSSv2 de acties uit op IRQL = DISPATCH_LEVEL, in de processorcontext van de verwerking van de aanvraag en werkt alleen op een subset van indirecte tabelvermeldingen die verwijzen naar de huidige processor. Dit betekent dat RSSv2 ontvangstwachtrijen dynamisch kan verspreiden over meerdere processors die veel sneller reageren dan RSSv1.

Twee OID's, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 en OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, zijn geïntroduceerd in RSSv2 voor minipoortstuurprogramma's om respectievelijk de juiste RSS-mogelijkheden in te stellen en de indirectietabel te beheren. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 een reguliere OID is, terwijl OID_GEN_RSS_SET_INDIRECTION_ENTRIES een synchrone OID is die NDIS_STATUS_PENDING niet kan retourneren. Zie de afzonderlijke referentiepagina's voor meer informatie over deze OID's. Zie Synchrone OID-aanvraaginterface in NDIS 6.80voor meer informatie over synchrone OID's.

RSSv2-terminologie

In dit artikel worden de volgende termen gebruikt:

Term Definitie
RSSv1 Het eerste generatie schalen van de eerste generatie ontvangt een schaalmechanisme aan de zijkant. Maakt gebruik van OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Het schaalmechanisme aan de ontvangende kant van de tweede generatie dat wordt ondersteund in Windows 10, versie 1803 en later, wordt beschreven in dit artikel.
Het schalen van een entiteit De miniportadapter zelf in Native RSS-modus of een VPort in RSSv2-modus.
ITE Een indirection table entry (ITE) van een bepaalde schaalentiteit. Het totale aantal IT's per VPort kan niet groter zijn dan NumberOfIndirectionTableEntriesPerNonDefaultPFVPort of NumberOfIndirectionTableEntriesForDefaultVPort in de VMQ-modus of 128 in het systeemeigen RSS-geval. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort en NumberOfIndirectionTableEntriesForDefaultVPort zijn onderdelen van de NDIS_NIC_SWITCH_CAPABILITIES-structuur.
Schaalmodus Het per-VPort vmswitchbeleid dat bepaalt hoe de ITE's tijdens runtime worden verwerkt. Dit kan statisch zijn (geen ITE-verplaatsingen als gevolg van belastingswijzigingen) of dynamisch (uitbreiding en samenvoeging, afhankelijk van de huidige verkeersbelasting).
Rij Een onderliggend hardwareobject (wachtrij) dat een ITE ondersteunt. Afhankelijk van de hardware en indirection table kan de configuratiewachtrij meerdere ITE's back-uppen. Het totale aantal wachtrijen, inclusief een wachtrij die wordt gebruikt door de standaardwachtrij, kan de vooraf geconfigureerde limiet doorgaans niet overschrijden die door een beheerder is ingesteld.
Standaardprocessor Een processor die pakketten ontvangt waarvoor de hash niet kan worden berekend. Elke VPort heeft een standaardprocessor.
Primaire processor Een processor die is opgegeven als de ProcessorAffinity lid van de NDIS_NIC_SWITCH_VPORT_PARAMETERS structuur tijdens het maken van VPort. Deze processor kan tijdens runtime worden bijgewerkt en geeft aan waar VMQ-verkeer wordt omgeleid.
Bron CPU De processor waaraan de ITE momenteel is toegewezen.
Doel-CPU De processor waaraan de ITE opnieuw wordt toegewezen (met behulp van RSSv2).
Acteur CPU De processor waarop RSSv2-aanvragen worden ingediend.

RSSv2-functionaliteit aangeven in een minipoortstuurprogramma

Miniport-stuurprogramma's adverteren RSSv2-ondersteuning door de CapabilitiesFlags in te stellen lid van de NDIS_RECEIVE_SCALE_CAPABILITIES-structuur met de vlag NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Deze mogelijkheid is vereist om de CPU-taakverdelingsfunctie van RSSv2 in te schakelen, samen met de NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED vlag die dynamische RSSv1-taakverdeling voor niet-standaard VPorts (VMQs) mogelijk maakt.

Notitie

Protocollen voor de bovenste laag gaan ervan uit dat de primaire processor van de standaard-VPort kan worden verplaatst voor RSSv2-minipoortstuurprogramma's.

Als een minipoortadapter geen RSSv2-mogelijkheid adverteert, blijven alle VMQ-ingeschakelde VPorts in de statische spreidmodus, zelfs als deze VPorts worden aangevraagd om dynamische verspreiding uit te voeren. De RSSv1-OID voor de configuratie van RSS-parameters, OID_GEN_RECEIVE_SCALE_PARAMETERS, wordt gebruikt voor deze VPorts die zich nog in de statische verspreidingsmodus bevinden.

Miniportstuurprogramma's hoeven slechts één RSS-besturingsmechanisme te implementeren: RSSv1 of RSSv2. Als het stuurprogramma RSSv2-ondersteuning adverteert, converteert NDIS RSSv1 OID's naar RSSv2-OID's indien nodig om per VPort-verspreiding te configureren. Het minipoortstuurprogramma moet de twee nieuwe OID's ondersteunen en het gedrag van de RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID als volgt wijzigen:

RSSv2-OID's verwerken

OID_GEN_RECEIVE_SCALE_PARAMETERS wordt alleen gebruikt om query's uit te voeren op de huidige RSS-parameters van een bepaalde schaalentiteit. In RSSv1 wordt deze OID gebruikt om parameters in te stellen. Voor minipoortstuurprogramma's die geschikt zijn voor RSSv2, voert NDIS deze rolconversie automatisch uit voor het stuurprogramma en geeft de volgende twee OID's uit om in plaats daarvan parameters in te stellen.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 is een reguliere OID en werd op dezelfde manier verwerkt als de OID_GEN_RECEIVE_SCALE_PARAMETERS OID in RSSv1 werd verwerkt. Deze OID is niet zichtbaar voor NDIS lichtgewicht filterdrivers (LWFs) vóór NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIESis echter een synchrone OID- die geen NDIS_STATUS_PENDING kunnen retourneren. Deze OID moet worden uitgevoerd en voltooid in de processorcontext die afkomstig is van de OID. Net als OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 is het ook niet zichtbaar voor NDIS LWFs vóór NDIS 6.80. LWFs in NDIS 6.80 en hoger zijn niet toegestaan om deze OID uit te stellen of naar een andere processor te gaan. De nettolading bevat een reeks eenvoudige verplaats ITE-acties, die elk een opdracht bevatten om één ITE voor een schaalentiteit naar een andere doel-CPU te verplaatsen. Elementen van de matrix kunnen verwijzen naar verschillende schaaltiteiten (VPorts).

Elk type NDIS-stuurprogramma, minipoort, filter en protocol heeft ingangspunten om de synchrone OID-aanvraaginterface te ondersteunen:

NDIS-stuurprogrammatype Synchrone OID-verwerker(s) Functie om synchrone OIDs te genereren
Minipoort MiniportSynchronousOidRequest N.V.T.
Filter NdisFSynchronousOidRequest
Protocol Niet van toepassing NdisSynchronousOidRequest

Statusovergangen van RSS, ITE-updates en primaire en standaardprocessors

Stuurparameters

In RSSv2 worden verschillende parameters gebruikt om verkeer naar de juiste CPU te sturen, afhankelijk van de RSS-status (ingeschakeld of uitgeschakeld). Wanneer RSS is uitgeschakeld, wordt alleen de primaire processor gebruikt voor het omleiden van verkeer. Wanneer RSS is ingeschakeld, worden zowel de standaardprocessor als alle IT's gebruikt voor het omleiden van verkeer. Deze stuurparameters worden aangeduid als 'actief' of 'inactief', samengevat in de volgende tabel:

Stuurparameter RSS uitgeschakeld RSS ingeschakeld
Primaire processor Actief Inactief
Standaardprocessor Inactief Actief
ITE[0..N] Inactief Actief

Wanneer een stuurparameter zich in de actieve staat bevindt, leidt het het verkeer. Vanaf het moment van een RSS-statusovergang die een parameter inactievemaakt, moeten minipoortstuurprogramma's wijzigingen in de parameter bijhouden totdat de omgekeerde overgang deze opnieuw activeert. Dit betekent dat een minipoortstuurprogramma alle updates moet bijhouden voor de standaardvermeldingen in de processor- en indirectietabel terwijl RSS is uitgeschakeld voor die schaalentiteit. Wanneer RSS is ingeschakeld, moet de huidige bijgehouden status voor de standaardprocessor en indirectietabel van kracht worden.

Denk bijvoorbeeld aan het scenario wanneer software vRSS al is ingeschakeld. In dit geval bestaat de indirectietabel al in het protocol van de bovenste laag en wordt deze actief gebruikt door de softwarespreidingscode van de bovenste laag. Als tijdens het inschakelen van RSS-hardware alle vermeldingen naar de primaire processor verwijzen voordat de updates voor verplaatsen de vermeldingen in de indirectietabel worden uitgegeven aan en uitgevoerd door de hardware, kan de primaire processor een korte jam ervaren. Als het minipoortstuurprogramma standaardprocessor- en ITE-gegevens heeft bijgehouden, kan het verkeer doorsturen naar waar het al wordt verwacht door de bovenste laag.

Hoewel minipoortstuurprogramma's alle updates voor inactieve stuurparameters moeten bijhouden, moeten ze de validatie van deze parameters uitstellen totdat de RSS-statuswijziging probeert deze parameters actief te maken . In het geval van bijvoorbeeld het spreiden van software terwijl hardware-RSS is uitgeschakeld, kunnen protocollen van de bovenste laag elke processor gebruiken om te spreiden (inclusief buiten de RSS-set van de adapter). De bovenste lagen zorgen ervoor dat, op het moment van de overgang van rss-status, alle inactieve parameters geldig zijn voor de nieuwe RSS-status. Het minipoortstuurprogramma moet echter nog steeds de parameters valideren en de RSS-statusovergang mislukken als wordt gedetecteerd dat bijgehouden inactieve stuurparameters ongeldig zijn.

Initiële status en updates voor stuurparameters

De volgende tabel beschrijft de initiële status van de schaalentiteit na het maken (bijvoorbeeld na het maken van VPort), en hoe de parameters kunnen worden bijgewerkt:

Parameter Beschrijving
Primaire processor
  • Geïnitialiseerd met de Affinity-processor die is opgegeven tijdens het creëren van de VPort.
  • Kan worden bijgewerkt door gebruik te maken van de OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID, waarbij de NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR vlag is ingesteld.
  • Kan worden bijgewerkt met behulp van de OID_NIC_SWITCH_VPORT_PARAMETERS OID met de NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED vlagset (dit is het compatibiliteitspad voor bestaande cmdlets).
  • Kan worden gelezen met behulp van de OID_NIC_SWITCH_VPORT_PARAMETERS OID met de vlag NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (dit is het compatibiliteitspad voor bestaande cmdlets).
  • Verplaatsingen na initialisatie van de primaire processor zijn niet van invloed op de standaardprocessor of de inhoud van de indirectietabel.
Standaardprocessor
  • Geïnitialiseerd met de Affinity--processor die is gespecificeerd bij het creëren van de VPort.
  • Kan worden bijgewerkt met behulp van de OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID met de NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR vlag ingesteld.
Indirectietabel
  • NumberOfIndirectionTableEntries is ingesteld op 1.
  • De enige vermelding wordt geïnitialiseerd met de Affinity processor die is opgegeven tijdens het maken van VPort.
  • Kan worden bijgewerkt met behulp van de OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID.

Bijgewerkte ITE's en de primaire/standaardprocessors worden met gebruik van OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES aangeroepen vanuit de processor waarnaar de bijbehorende invoer momenteel verwijst. Voor een bepaalde VPort zorgt de bovenste laag ervoor dat er in deze omstandigheden geen OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID’s voor het verplaatsen van ITE’s of het instellen van de primaire/standaardprocessors worden uitgegeven.

  1. Terwijl OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 wordt uitgevoerd.
  2. Nadat de VPort-verwijderingsprocedure is gestart. De bovenste laag geeft bijvoorbeeld pas de set filter-OID uit nadat de laatste OID voor het verplaatsen van ITEs is voltooid.

RSS-uitschakeling

Tijdens de RSS-uitschakeling kan het protocol van de bovenste laag ervoor kiezen om alle ITE's naar de primaire processor te laten wijzen en vervolgens de OID uit te geven om RSS uit te schakelen, of het kan ervoor kiezen om de indirectietabel as-is te behouden en RSS uit te schakelen. In beide gevallen moet het ontvangen verkeer gericht zijn op de primaire processor.

RSSv2 onderhoudt een vereiste van RSSv1 waarmee het protocol van de bovenste laag een VPort kan verwijderen zonder eerst RSS uit te schakelen. De bovenste laag kan het ontvangstfilter op de VPort instellen op nul, zodat er geen verkeer wordt ontvangen via de VPort en vervolgens verdergaat met het verwijderen van VPort zonder RSS uit te schakelen. De bovenste laag garandeert dat er geen OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID's worden uitgegeven tijdens of na het verwijderen van VPort.

Tijdens zowel RSS-uitschakeling als VPort-verwijdering moet het minipoortstuurprogramma zorgen voor eventuele interne bewerkingen die mogelijk bestaan vanwege eerdere verplaatsingen van de wachtrij.

RSSv2-invarianten

Het protocol van de bovenste laag zorgt ervoor dat belangrijke invarianten niet worden geschonden voordat beheerfuncties of ITE-verplaatsingen worden uitgevoerd. Bijvoorbeeld:

  1. Voordat u het aantal wachtrijen verkleint, zorgt de bovenste laag ervoor dat de indirectietabel niet verwijst naar meer processors dan het nieuwe aantal wachtrijen voor een VPort.
  2. De bovenste laag mag geen update van een indirecte tabel aanvragen die het momenteel geconfigureerde aantal wachtrijen voor een VPort schendt. Het minipoortstuurprogramma moet deze regel afdwingen en een foutmelding retourneren.
  3. Voordat u het aantal vermeldingen in de indirectietabel voor VMMQ-RESTRICTED-adapters wijzigt, zorgt de bovenste laag ervoor dat de inhoud van de indirectietabel wordt genormaliseerd tot de macht van 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

Synchrone OID-aanvraaginterface in NDIS 6.80