Dela via


Ta emot sidoskalning version 2 (RSSv2)

Skalning på mottagarsidan förbättrar systemprestandan för hantering av nätverksdata i system med flera processorer. NDIS 6.80 och senare stöder RSS Version 2 (RSSv2), som utökar RSS genom att erbjuda dynamisk spridning per VPort av köer.

Överblick

Jämfört med RSSv1 förkortar RSSv2 tiden mellan mätningen av CPU-belastning och uppdatering av indirektionstabellen, vilket undviker att fördröjas under situationer med hög trafik. För att åstadkomma detta utför RSSv2 sina åtgärder på IRQL = DISPATCH_LEVEL, i processorkontexten för att hantera begäran, och fungerar endast på en delmängd av indirekta tabellposter som pekar på den aktuella processorn. Det innebär att RSSv2 dynamiskt kan sprida mottagningsköer över flera processorer mer responsivt än RSSv1.

Två OID:er, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 och OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, har introducerats i RSSv2 för miniportdrivrutiner för att ange rätt RSS-funktioner respektive kontrollera indirektionstabellen. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 är en vanlig OID, medan OID_GEN_RSS_SET_INDIRECTION_ENTRIES är en synkron OID som inte kan returnera NDIS_STATUS_PENDING. Mer information om dessa OID:er finns på deras enskilda referenssidor. Mer information om synkrona OID:er finns i synkront gränssnitt för OID-begäran i NDIS 6.80.

RSSv2-terminologi

Den här artikeln använder följande termer:

Term Definition
RSSv1 Den första generationen får en mekanism för sidoskalning. Använder OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Den andra generationen får en mekanism för sidoskalning som stöds i Windows 10, version 1803 och senare, som beskrivs i den här artikeln.
Skalbar entitet Själva miniportadaptern i internt RSS-läge eller en VPort i RSSv2-läge.
ITE En indirekt tabellpost (ITE) för en viss skalningsentitet. Det totala antalet Indirection Table Entries (ITE) per VPort får inte överstiga NumberOfIndirectionTableEntriesPerNonDefaultPFVPort eller NumberOfIndirectionTableEntriesForDefaultVPort i VMQ-läge eller 128 i det inhemska RSS-fallet. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort och NumberOfIndirectionTableEntriesForDefaultVPort är medlemmar av NDIS_NIC_SWITCH_CAPABILITIES-struktur.
Skalningsläge vmswitch-policyn per VPort som styr hur dess ITEs hanteras vid körtid. Detta kan vara statiskt (inga ITE-rörelser på grund av belastningsändringar) eller dynamisk (expansion och sammankoppling beroende på aktuell trafikbelastning).
Ett underliggande maskinvaruobjekt (kö) som stöder en ITE. Beroende på maskinvaran och indirektionstabellen kan konfigurationskön stödja flera ITEs. Det totala antalet köer, inklusive en kö som används av standardkön, får inte överskrida den förkonfigurerade gräns som vanligtvis anges av en administratör.
Förvald processor En processor som tar emot paket som hashen inte kan beräknas för. Varje VPort har en standardprocessor.
Primär processor En processor som anges som ProcessorAffinity medlem i NDIS_NIC_SWITCH_VPORT_PARAMETERS-strukturen när VPort skapas. Den här processorn kan uppdateras vid körning och anger var VMQ-trafik dirigeras.
Käll-CPU Den processor som ITE för närvarande är mappad till.
Mål-CPU Processorn till vilken ITE ommapplas (med RSSv2).
Aktörs-CPU Processorn som RSSv2-begäranden görs på.

Kommunicera RSSv2-funktion i en miniportdrivrutin

Miniportdrivrutiner annonserar RSSv2-stöd genom att ange CapabilitiesFlags medlem i NDIS_RECEIVE_SCALE_CAPABILITIES struktur med flaggan NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Den här funktionen krävs för att aktivera RSSv2:s processorbelastningsutjämningsfunktion, tillsammans med flaggan NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED som möjliggör dynamisk utjämning av RSSv1 för icke-standard-VPorts (VMQ).

Not

Protokoll på det övre lagret förutsätter att den primära processorn för standard-VPort kan flyttas för RSSv2-miniportdrivrutiner.

Om ett miniportkort inte annonserar RSSv2-funktioner förblir alla VMQ-aktiverade virtuella portar i statiskt spridningsläge även om dessa virtuella portar begärs för dynamisk spridning. RSSv1 OID för konfiguration av RSS-parametrar, OID_GEN_RECEIVE_SCALE_PARAMETERS, används för dessa VPorts som fortfarande befinner sig i statiskt spridningsläge.

Miniportdrivrutiner behöver bara implementera en RSS-kontrollmekanism – antingen RSSv1 eller RSSv2. Om drivrutinen annonserar RSSv2-stöd konverterar NDIS RSSv1-OID:er till RSSv2-OID:er om det behövs för att konfigurera spridning per VPort. Miniportdrivrutinen måste ha stöd för de två nya OID:erna och ändra beteendet för RSSv1-OID_GEN_RECEIVE_SCALE_PARAMETERS OID enligt följande:

Hantera RSSv2-OID:er

OID_GEN_RECEIVE_SCALE_PARAMETERS används bara för att fråga efter aktuella RSS-parametrar för en viss skalningsentitet. I RSSv1 används denna OID för att ange parametrar. För RSSv2-kompatibla miniportdrivrutiner utför NDIS automatiskt den här rollkonverteringen för drivrutinen och utfärdar följande två OID:er för att ange parametrar i stället.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 är en vanlig OID och hanteras på samma sätt som OID_GEN_RECEIVE_SCALE_PARAMETERS OID hanterades i RSSv1. Denna OID är inte synlig för NDIS lättviktsfilterdrivrutiner (LWFs) före NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIESär dock en synkron OID- som inte kan returnera NDIS_STATUS_PENDING. Denna OID måste köras och slutföras i processorkontexten som har sitt ursprung i OID. Precis som OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 är den inte heller synlig för NDIS LWFs före NDIS 6.80. LWFs i NDIS 6.80 och senare tillåts inte fördröja denna OID eller flytta till en annan processor. Nyttolasten innehåller en matris med enkla "flytta ITE"-åtgärder, som var och en innehåller ett kommando för att flytta en enskild ITE för en skalningsentitet till en annan mål-CPU. Element i matrisen kan referera till olika skalningsentiteter (VPorts).

Varje typ av NDIS-drivrutin, miniport, filter och protokoll har startpunkter som stöd för gränssnittet för synkron OID-begäran:

NDIS-drivrutinstyp Synkrona OID-hanterare Funktion för att generera synkrona OID:ar
Miniport MiniportSynchronousOidRequest Ej tillämpligt
Filter NdisFSynchronousOidRequest
Protokoll Ej tillämpligt NdisSynchronousOidRequest

RSS-tillståndsövergångar, ITE-uppdateringar och primära/standardprocessorer

Styrparametrar

I RSSv2 används olika parametrar för att styra trafiken till rätt CPU beroende på RSS-tillståndet (aktiverat eller inaktiverat). När RSS är inaktiverat används endast den primära processorn för att dirigera trafik. När RSS är aktiverat används både standardprocessorn och alla ITE:er för att dirigera trafik. Dessa styrparametrar är märkta som "aktiva" eller "inaktiva", sammanfattade i följande tabell:

Styrparameter RSS har inaktiverats RSS-aktiverat
Primär processor Aktiv Inaktiv
Förvald processor Inaktiv Aktiv
ITE[0..N] Inaktiv Aktiv

När en styrparameter är i aktivt läge dirigerar den trafiken. Från tidpunkten för en RSS-tillståndsövergång som gör en parameter inaktivmåste miniportdrivrutiner spåra ändringar i parametern tills den omvända övergången aktiverar den igen. Det innebär att en miniportdrivrutin måste spåra alla uppdateringar av standardprocessorn och posterna i indirektionstabellerna medan RSS är inaktiverat för den skalningsentiteten. När RSS är aktiverat bör det aktuella spårade tillståndet för standardprocessorn och indirektionstabellen träda i kraft.

Tänk till exempel på scenariot när programvara vRSS redan är aktiverad. I det här fallet finns redan indirektionstabellen i det övre skiktprotokollet och används aktivt av det övre lagrets programspridningskod. Om, vid aktivering av maskinvaru-RSS, alla poster börjar peka på den primära processorn innan uppdateringarna flyttas och indirekttabellposter utfärdas till och körs av maskinvaran, kan den primära processorn uppleva ett kort stopp. Om miniportdrivrutinen har spårat standardprocessor och ITE-information kan den dirigera trafik till den nivå där den redan förväntas av det övre lagret.

Även om miniportdrivrutiner måste spåra alla uppdateringar av inaktiva styrparametrar bör de skjuta upp valideringen av dessa parametrar tills RSS-tillståndsändringen försöker göra dessa parametrar aktiva. Om t.ex. programvara sprids medan maskinvaru-RSS är inaktiverat, kan protokoll på det övre lagret använda valfri processor för spridning (även utanför adapterns RSS-uppsättning). De övre lagren ser till att, vid övergången till RSS-tillstånd, alla inaktiva parametrar är giltiga för det nya RSS-tillståndet. Miniportdrivrutinen bör dock fortfarande verifiera parametrarna och misslyckas med RSS-tillståndsövergången om den upptäcker att eventuella spårade inaktiva styrparametrar är ogiltiga.

Inledande tillstånd och uppdateringar av styrparametrar

I följande tabell beskrivs det initiala tillståndet för skalningsentiteten efter skapandet (till exempel efter att VPort har skapats) samt hur parametrarna kan uppdateras:

Parameter Beskrivning
Primär processor
  • Initierades med den tillhörighet processor som angavs när VPort skapades.
  • Kan uppdateras med hjälp av OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID med flaggan NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR inställd.
  • Kan uppdateras med hjälp av OID_NIC_SWITCH_VPORT_PARAMETERS OID med flaggan NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (det här är kompatibilitetssökvägen för befintliga cmdletar).
  • Kan läsas med hjälp av OID_NIC_SWITCH_VPORT_PARAMETERS OID med flaggan NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (det här är kompatibilitetssökvägen för befintliga cmdletar).
  • Flyttningar efter initieringen av den primära processorn påverkar inte standardprocessorn eller innehållet i tabellen indirection.
Standardprocessor
  • Initierades med Affinity-processor som specificerades under skapandet av VPort.
  • Kan uppdateras med hjälp av OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID med flaggan NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR inställd.
Tabellen Indirection
  • NumberOfIndirectionTableEntries är inställd på 1.
  • Den enda posten initieras med den tillhörighet processor som angavs när VPort skapades.
  • Kan uppdateras med hjälp av OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID.

Uppdateringar av IT-enheter och primära/standardprocessorer (med OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) anropas från processorn som motsvarande post för närvarande pekar på. För en viss VPort säkerställer det övre lagret att inga OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID:er för att flytta ITE:er eller ange primära/standardprocessorer kommer att utfärdas under dessa omständigheter:

  1. Medan OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 pågår.
  2. När borttagningssekvensen för VPort har initierats. Det övre lagret ställer in filtret först efter att det sista OID:et för att flytta ITE:er har fullbordats.

RSS-inaktivering

Under RSS-inaktivering kan det övre skiktprotokollet välja att antingen peka alla ITE:er till den primära processorn och sedan utfärda OID för att inaktivera RSS, eller så kan det välja att lämna indirektionstabellen as-is och inaktivera RSS. I båda fallen bör ta emot trafik riktas mot den primära processorn.

RSSv2 upprätthåller ett krav från RSSv1 som tillåter det övre skiktprotokollet att ta bort en VPort utan att först inaktivera RSS. Det övre lagret kan ställa in mottagningsfiltret på VPort till noll, vilket genom att säkerställa att ingen trafik mottas via VPort, kan fortsätta med VPort-borttagningen utan att inaktivera RSS. Det övre lagret garanterar att inga OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES OID:ar utfärdas under eller efter borttagning av VPort.

Under både inaktivering av RSS och borttagning av VPort bör miniportdrivrutinen hantera eventuella väntande interna åtgärder som kan finnas på grund av tidigare köflyttningar.

RSSv2-invarianter

Det övre skiktprotokollet säkerställer att viktiga invarianter inte överträds innan du utför hanteringsfunktioner eller ITE-rörelser. Till exempel:

  1. Innan du minskar antalet köer ser det övre lagret till att indirektionstabellen inte refererar till fler processorer än det nya antalet köer för en VPort.
  2. Det övre lagret bör inte begära en indirekt tabelluppdatering som bryter mot det för närvarande konfigurerade antalet köer för en VPort. Miniportdrivrutinen ska framtvinga den här regeln och returnera ett felmeddelande.
  3. Innan du ändrar antalet poster i indirektionstabellen för VMMQ-RESTRICTED-kort ser det övre lagret till att innehållet i indirektionstabellen normaliseras till en tvåpotens.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

synkront OID-begärandegränssnitt i NDIS 6.80