Sdílet prostřednictvím


Škálování na straně příjmu verze 2 (RSSv2)

Škálování na straně příjmu zlepšuje výkon systému související se zpracováním síťových dat v multiprocesorových systémech. NDIS 6.80 a novější podporují RSS verze 2 (RSSv2), které rozšiřují RSS nabídkou dynamického rozložení front podle jednotlivých VPortů.

Přehled

V porovnání s RSSv1 zkracuje RSSv2 dobu mezi měřením zatížení procesoru a aktualizací tabulky nepřímých přenosů, aby se zabránilo zpomalení v situacích s vysokým provozem. K tomu RSSv2 provádí své akce v IRQL = DISPATCH_LEVEL, v kontextu procesoru zpracování požadavku a pracuje pouze s podmnožinou položek tabulky nepřímých volání, které odkazují na aktuální procesor. To znamená, že RSSv2 může dynamicky rozprostřít fronty příjmu přes více procesorů mnohem citlivěji než RSSv1.

Dva identifikátory OID, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 a OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, byly zavedeny v RSSv2 pro ovladače miniportu, aby nastavily správné schopnosti RSS a řízení tabulky přesměrování. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 je běžný OID, zatímco OID_GEN_RSS_SET_INDIRECTION_ENTRIES je synchronní OID, který nemůže vrátit NDIS_STATUS_PENDING. Další informace o těchto identifikátorech OID najdete na jednotlivých referenčních stránkách. Další informace o synchronních OID naleznete v části Synchronní rozhraní požadavku OID v NDIS 6.80.

Terminologie RSSv2

Tento článek používá následující termíny:

Termín Definice
RSSv1 Mechanismus škálování na přijímací straně první generace. Používá OID_GEN_RECEIVE_SCALE_PARAMETERS.
RSSv2 Druhá generace přijímá mechanismus škálování na straně podporovaný ve Windows 10 verze 1803 a novější, jak je popsáno v tomto článku.
Škálovací entita Samotný adaptér miniportu v nativním režimu RSS nebo VPort v režimu RSSv2.
ITE Nepřímá položka tabulky (ITE) dané entity škálování. Celkový počet ITE na VPort nesmí překročit NumberOfIndirectionTableEntriesPerNonDefaultPFVPort nebo NumberOfIndirectionTableEntriesForDefaultVPort v režimu VMQ, nebo 128 v případě nativního režimu RSS. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort a NumberOfIndirectionTableEntriesForDefaultVPort jsou členy struktury NDIS_NIC_SWITCH_CAPABILITIES.
Režim škálování Zásada přepínače VM pro každý VPort, která řídí, jak jsou jeho ITE zpracovávány za běhu. Může to být statické (žádné přesuny ITE kvůli změnám zatížení) nebo dynamické (rozšíření a sloučování v závislosti na aktuálním zatížení provozu).
Fronta Základní hardwarový objekt (fronta), který podporuje ITE. Konfigurační fronta může v závislosti na hardwaru a nepřímé tabulce podporovat více ITE. Celkový počet front, včetně fronty, která je používána jako výchozí fronta, nemůže překročit předkonfigurovaný limit, který obvykle nastavuje správce.
Výchozí procesor Procesor, který přijímá pakety, pro které nelze vypočítat hodnotu hash. Každý VPort má výchozí procesor.
Primární procesor Procesor zadaný jako ProcessorAffinity člen struktury NDIS_NIC_SWITCH_VPORT_PARAMETERS během vytváření VPort. Tento procesor je možné aktualizovat za běhu a určuje, kam se směruje provoz VMQ.
Zdrojový procesor Procesor, na který je ITE aktuálně namapován.
Cílový procesor Procesor, na který je ITE přemapováváno (pomocí RSSv2).
Procesor objektu actor Procesor, na kterém se provádějí požadavky RSSv2.

Inzerce schopnosti RSSv2 v miniport ovladači

Ovladače miniportu inzerují podporu RSSv2 nastavením CapabilitiesFlags člen struktury NDIS_RECEIVE_SCALE_CAPABILITIES příznakem NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Tato funkce je nutná k povolení funkce vyrovnávání zatížení CPU pro RSSv2 spolu s příznakem NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED, který umožňuje dynamické vyrovnávání RSSv1 pro jiné než výchozí VPorts (VMQs).

Poznámka

Protokoly horní vrstvy předpokládají, že primární procesor výchozího VPortu lze přesunout pro ovladače miniportu RSSv2.

Pokud adaptér miniportu neinzeruje schopnost RSSv2, zůstanou všechny virtuální porty s podporou VMQ v režimu statického šíření i v případě, že jsou tyto virtuální porty požadovány k provádění dynamického šíření. Identifikátor RSSv1 pro konfiguraci parametrů RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, se používá pro tyto VPorty, které jsou stále v statickém režimu šíření.

Ovladače miniportu stačí implementovat pouze jeden řídicí mechanismus RSS – RSSv1 nebo RSSv2. Pokud ovladač inzeruje podporu RSSv2, NDIS převede identifikátory OID RSSv1 na identifikátory OID RSSv2 v případě potřeby pro konfiguraci šíření podle VPortu. Ovladač miniportu musí podporovat dva nové OIDy a upravit chování OID RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS následujícím způsobem:

Zpracování identifikátorů OID RSSv2

OID_GEN_RECEIVE_SCALE_PARAMETERS se používá pouze k dotazování aktuálních parametrů RSS dané škálovací entity. V RSSv1 se tento identifikátor OID používá k nastavení parametrů. U ovladačů miniportu podporujících RSSv2 služba NDIS automaticky provede převod této role pro ovladač a místo toho vydá následující dvě identifikátory OID, aby nastavily parametry.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 je běžný identifikátor OID a zpracovává se stejně, jako se zpracovával identifikátor OID_GEN_RECEIVE_SCALE_PARAMETERS v RSSv1. Tento identifikátor OID není viditelný pro ovladače filtru NDIS s nízkou hmotností (LWF) před NDIS 6.80.

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIESje však synchronní OID, který nemůže vrátit NDIS_STATUS_PENDING. Tento OID musí být proveden a dokončen v kontextu procesoru, který OID zadal. Stejně jako OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 není ani NDIS LWFs viditelné před NDIS 6.80. Soubory LWFs ve verzi NDIS 6.80 a novějších nejsou povolené pozdržet tento identifikátor OID nebo přejít na jiný procesor. Jeho datová část obsahuje pole jednoduchých akcí „přesunutí ITE“, z nichž každá zahrnuje příkaz k přesunutí jedné ITE pro škálovací entitu na jiný cílový procesor. Prvky pole můžou odkazovat na různé entity škálování (VPorts).

Každý typ ovladače NDIS, miniportu, filtru a protokolu má vstupní body pro podporu synchronního rozhraní požadavku OID:

Typ ovladače NDIS Synchronní obslužné rutiny OID Funkce původu synchronních identifikátorů OID
Miniport MiniportSynchronousOidRequest Není k dispozici
Filtr NdisFSynchronousOidRequest
Protokol Není k dispozici NdisSynchronousOidRequest

Přechody stavu RSS, aktualizace ITE a primární/výchozí procesory

Parametry řízení

V RSSv2 se pro směrování provozu do správného procesoru používají různé parametry v závislosti na stavu RSS (povoleném nebo zakázaném). Pokud je technologie RSS zakázaná, používá se pouze primární procesor pro směrování provozu. Pokud je technologie RSS povolená, pro směrování provozu se používají výchozí procesor i všechny ITE. Tyto parametry řízení jsou označené jako "aktivní" nebo "neaktivní", shrnuté v následující tabulce:

Parametr řízení Technologie RSS je zakázaná Technologie RSS povolená
Primární procesor Aktivní Neaktivní
Výchozí procesor Neaktivní Aktivní
ITE[0..N] Neaktivní Aktivní

Pokud je parametr řízení v aktivním stavu , směruje provoz. Od okamžiku přechodu stavu RSS, který vytvoří parametr neaktivní, ovladače miniportu musí sledovat změny parametru, dokud ho zpětný přechod znovu neaktivuje. To znamená, že ovladač miniportu musí sledovat všechny aktualizace výchozího procesoru a položek nepřímé tabulky, zatímco RSS je pro danou škálující entitu zakázané. Pokud je technologie RSS povolená, měl by se projevit aktuální sledovaný stav výchozího procesoru a tabulky nepřímého přístupu.

Představte si například scénář, kdy je software vRSS již povolený. V tomto případě tabulka nepřímých dat již existuje v protokolu horní vrstvy a aktivně ji používá kód šíření softwaru horní vrstvy. Pokud během hardwarového povolení RSS všechny položky začnou odkazovat na primární procesor dříve, než jsou aktualizace a přesun položek v nepřímé tabulce hardwarově zpracovávány a prováděny, může primární procesor zaznamenat kratší prodlevu. Pokud ovladač miniportu sleduje výchozí procesor a informace o ITE, může směrovat provoz tam, kam ho již očekává horní vrstva.

Zatímco ovladače miniportu musí sledovat všechny aktualizace neaktivních parametrů řízení, měly by odložit ověření těchto parametrů, dokud se změna stavu RSS nepokouší provést tyto parametry aktivní. Například v případě šíření softwaru v době, kdy je technologie RSS hardwaru zakázaná, můžou protokoly horní vrstvy používat jakýkoli procesor k šíření (včetně mimo sadu RSS adaptéru). Horní vrstvy zajišťují, aby v okamžiku přechodu stavu RSS byly všechny neaktivní parametry platné pro nový stav RSS. Pokud ale ovladač miniportu zjistí, že všechny sledované neaktivní parametry řízení jsou neplatné, měl by stále ověřit parametry a přechod stavu RSS se nezdaří.

Počáteční stav a aktualizace parametrů řízení

Následující tabulka popisuje počáteční stav entity škálování po vytvoření (například po vytvoření VPortu) a způsob aktualizace parametrů:

Parametr Popis
Primární procesor
  • Inicializováno s procesorem spřažení zadaným během vytváření VPortu.
  • Aktualizaci lze provést pomocí identifikátoru OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES s příznakem NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_PRIMARY_PROCESSOR nastaveným.
  • Je možné aktualizovat pomocí identifikátoru OID_NIC_SWITCH_VPORT_PARAMETERS s příznakem NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED nastaveným (to je cesta kompatibility s existujícími rutinami).
  • Lze načíst pomocí identifikátoru OID_NIC_SWITCH_VPORT_PARAMETERS s příznakem NDIS_NIC_SWITCH_VPORT_PARAMS_PROCESSOR_AFFINITY_CHANGED (toto je cesta kompatibility pro stávající moduly cmdlet).
  • Přesunutí po inicializaci primárního procesoru nemá vliv na výchozí procesor ani na obsah tabulky nepřímých přesměrování.
Výchozí procesor
  • Při vytváření VPortu byl inicializován procesor Affinity.
  • Lze aktualizovat pomocí identifikátoru OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES s nastaveným příznakem NDIS_RSS_SET_INDIRECTION_ENTRY_FLAG_DEFAULT_PROCESSOR.
Tabulka nepřímé adresace
  • NumberOfIndirectionTableEntries je nastaveno na 1.
  • Jediná položka se inicializuje s procesorem spřažení zadaným během vytváření VPortu.
  • Lze aktualizovat pomocí identifikátoru OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES.

Aktualizace ITE a primárních/výchozích procesorů (pomocí OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) se vyvolávají z procesoru, na který aktuálně odkazuje odpovídající položka. Pro daný VPort horní vrstva zajišťuje, že za těchto okolností nebudou vydány žádné OIDy OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES pro přesunutí ITE nebo nastavení primárních/výchozích procesorů:

  1. Probíhá OID_GEN_RECEIVE_SCALE_PARAMETERS_V2.
  2. Po zahájení sekvence odstranění VPortu. Například horní vrstva vydává nastavený filtr OID pouze po dokončení posledního OID k přesunutí ITE.

Zakázání RSS

Během zakazování rss se může protokol horní vrstvy rozhodnout, že má buď nasměrovat všechny ITE na primární procesor, pak vydat identifikátor OID pro zakázání RSS, nebo se může rozhodnout ponechat tabulku nepřímých připojení as-is a zakázat RSS. V obou případech by měl přijatý provoz cílit na primární procesor.

RSSv2 zachovává požadavek z RSSv1, který umožňuje protokolu vyšší vrstvy odstranit VPort, aniž by nejprve zakázal RSS. Horní vrstva může nastavit filtr příjmu na VPort na nulu, čímž zajistí, že žádný příjem provozu neprotéká přes VPort, a pak pokračovat v odstranění VPort bez zakázání RSS. Horní vrstva zaručuje, že během nebo po odstranění VPortu nebudou vydány žádné OIDy OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES.

Během vypnutí RSS a odstranění VPort by se měl ovladač miniportu postarat o všechny čekající interní operace, které by mohly existovat kvůli předchozím přesunům fronty.

Invarianty RSSv2

Protokol horní vrstvy zajišťuje, aby před prováděním funkcí správy nebo přesunů ITE nedošlo k porušení důležitých invariantů. Například:

  1. Před snížením počtu front zajišťuje horní vrstva, že tabulka nepřímých odkazů neodkazuje na více procesorů než na nový počet front pro VPort.
  2. Horní vrstva by neměla požadovat aktualizaci nepřímé tabulky, která porušuje aktuálně nakonfigurovaný počet front pro VPort. Ovladač miniportu by měl toto pravidlo vynutit a vrátit chybu.
  3. Než horní vrstva změní počet položek nepřímé tabulky pro adaptéry VMMQ-RESTRICTED, zajistí, aby byl obsah tabulky normalizován na mocninu 2.

OID_GEN_RECEIVE_SCALE_PARAMETERS_V2

OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES

synchronního rozhraní požadavku OID v NDIS 6.80