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:
- OID_GEN_RECEIVE_SCALE_PARAMETERS wordt alleen gebruikt voor queryaanvragen in RSSv2 en niet voor het instellen van RSS-parameters.
- OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 is een query en een Set-OID die wordt gebruikt voor het configureren van de parameters van de schaalaanpassingsentiteit, zoals het aantal wachtrijen, het aantal IT's, RSS-in- en uitschakeling, en updates van de hashsleutel.
- OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES is een methode-OID die wordt gebruikt voor het wijzigen van indirection table entries.
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 |
|
Standaardprocessor |
|
Indirectietabel |
|
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.
- Terwijl OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 wordt uitgevoerd.
- 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:
- 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.
- 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.
- 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.
Verwante koppelingen
OID_GEN_RECEIVE_SCALE_PARAMETERS_V2