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). |
Kö | 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:
- OID_GEN_RECEIVE_SCALE_PARAMETERS används endast för frågebegäranden i RSSv2 och inte för att ange RSS-parametrar.
- OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 är en fråga och en uppsättning OID som används för att konfigurera skalningsentitetens parametrar, till exempel antalet köer, antalet ITE:er, RSS-aktivering/inaktivering och uppdateringar av hash-nyckel.
- OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES är en metod-OID som används för att ändra poster i indirekta tabeller.
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 |
|
Standardprocessor |
|
Tabellen Indirection |
|
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:
- Medan OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 pågår.
- 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:
- 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.
- 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.
- 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.
Relaterade länkar
OID_GEN_RECEIVE_SCALE_PARAMETERS_V2