Skalowanie po stronie odbierającej w wersji 2 (RSSv2)
Skalowanie po stronie odbierającej poprawia wydajność systemu związaną z obsługą danych sieciowych w systemach wieloprocesorowych. Wersja NDIS 6.80 i nowsze obsługują RSS w wersji 2 (RSSv2), który rozszerza funkcję RSS, oferując dynamiczne rozłożenie kolejek na poziomie VPort.
Przegląd
W porównaniu z rsSv1 rsSv2 skraca czas między pomiarem obciążenia procesora CPU i aktualizowaniem tabeli pośredniej, unikając spowolnienia w sytuacjach dużego ruchu. Aby to osiągnąć, RSSv2 wykonuje swoje działania przy IRQL = DISPATCH_LEVEL, w kontekście procesora obsługującego żądanie i działa tylko na podzbiorze wpisów tabeli pośredniczącej, które wskazują na bieżący procesor. Oznacza to, że RSSv2 może dynamicznie rozkładać kolejki odbierające na wiele procesorów znacznie bardziej responsywnie niż RSSv1.
Dwa identyfikatory OID, OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 i OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES, zostały wprowadzone w RSSv2 dla sterowników miniportu w celu ustawienia odpowiednich funkcji RSS oraz odpowiednio sterowania tabelą pośrednią. OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 jest zwykłym OID, a OID_GEN_RSS_SET_INDIRECTION_ENTRIES jest synchronicznym OID, który nie może zwrócić NDIS_STATUS_PENDING. Aby uzyskać więcej informacji na temat tych identyfikatorów obiektów, zobacz ich indywidualne strony odniesienia. Aby uzyskać więcej informacji na temat synchronicznych identyfikatorów OID, zobacz sekcję dotyczącą synchronicznego interfejsu żądania OID w NDIS 6.80.
Terminologia RSSv2
W tym artykule są używane następujące terminy:
Termin | Definicja |
---|---|
RSSv1 | Mechanizm skalowania pierwszej generacji po stronie odbierającej. Używa OID_GEN_RECEIVE_SCALE_PARAMETERS. |
RSSv2 | Mechanizm skalowania po stronie odbioru drugiej generacji obsługiwany w systemie Windows 10, wersja 1803 i nowsze, opisany w tym artykule. |
Jednostka skalowania | Adapter miniportu w trybie natywnym RSS lub VPort w trybie RSSv2. |
ITE | Wpis tabeli pośredniej (ITE) danej jednostki skalowania. Całkowita liczba ITE na VPort nie może przekroczyć NumberOfIndirectionTableEntriesPerNonDefaultPFVPort ani NumberOfIndirectionTableEntriesForDefaultVPort w trybie VMQ lub 128 w przypadku natywnego RSS. NumberOfIndirectionTableEntriesPerNonDefaultPFVPort i NumberOfIndirectionTableEntriesForDefaultVPort są członkami struktury NDIS_NIC_SWITCH_CAPABILITIES. |
Tryb skalowania | Zasady przełącznika vmswitch per-VPort, które kontrolują sposób obsługi jego ITE w czasie działania. Może to być statyczne (brak przesunięć ITE z uwagi na zmiany w obciążeniu) lub dynamiczne (rozszerzanie i łączenie zależnie od bieżącego obciążenia ruchem). |
Kolejka | Podstawowy obiekt sprzętowy (kolejka), który wspiera ITE. W zależności od sprzętu i tabeli pośredniej, kolejka konfiguracji może obsługiwać wiele ITE. Łączna liczba kolejek, w tym kolejka używana przez domyślną kolejkę, nie może przekroczyć wstępnie skonfigurowanego limitu zwykle ustawionego przez administratora. |
Procesor domyślny | Procesor odbierający pakiety, dla których nie można obliczyć skrótu. Każdy port VPort ma procesor domyślny. |
Procesor podstawowy | Procesor określony jako ProcessorAffinity człon struktury NDIS_NIC_SWITCH_VPORT_PARAMETERS podczas tworzenia VPort. Ten procesor można zaktualizować w czasie wykonywania i określa, gdzie jest kierowany ruch VMQ. |
Procesor źródłowy | Procesor, do którego jest obecnie przyporządkowany ITE. |
Docelowy procesor CPU | Procesor, na który jest ponownie mapowany ITE (przy użyciu RSSv2). |
Procesor aktora CPU | Procesor, na którym są wykonywane żądania RSSv2. |
Reklamowanie możliwości RSSv2 w sterowniku miniportu
Sterowniki miniportu ogłaszają obsługę RSSv2 przez ustawienie elementu CapabilitiesFlags struktury NDIS_RECEIVE_SCALE_CAPABILITIES przy użyciu flagi NDIS_RSS_CAPS_SUPPORTS_INDEPENDENT_ENTRY_MOVE. Ta funkcja jest wymagana do włączenia funkcji równoważenia obciążenia procesora w RSSv2, wraz z flagą NDIS_RECEIVE_FILTER_DYNAMIC_PROCESSOR_AFFINITY_CHANGE_SUPPORTED, która umożliwia dynamiczne równoważenie RSSv1 dla innych niż domyślne VPortów (VMQs).
Notatka
Protokoły górnej warstwy zakładają, że podstawowy procesor domyślnego portu VPort można przenieść dla sterowników miniport RSSv2.
Jeśli adapter miniportu nie reklamuje możliwości RSSv2, wszystkie VPorty z obsługą protokołu VMQ pozostają w trybie rozkładu statycznego, nawet jeśli te VPorty mają być używane do przeprowadzania dynamicznego rozkładu. Identyfikator OID dla RSSv1 do konfiguracji parametrów RSS, OID_GEN_RECEIVE_SCALE_PARAMETERS, jest używany dla tych wirtualnych portów, które są nadal w trybie rozkładu statycznego.
Sterowniki Miniport muszą implementować tylko jeden mechanizm sterowania RSS — RSSv1 lub RSSv2. Jeśli sterownik ogłasza obsługę RSSv2, NDIS przekonwertuje identyfikatory OID RSSv1 na identyfikatory OID RSSv2, jeśli to konieczne, aby skonfigurować rozpraszanie per VPort. Sterownik miniportu musi obsługiwać dwa nowe identyfikatory OID i zmodyfikować zachowanie RSSv1 OID_GEN_RECEIVE_SCALE_PARAMETERS OID w następujący sposób:
- OID_GEN_RECEIVE_SCALE_PARAMETERS jest używany tylko w przypadku żądań zapytań w RSSv2, a nie do ustawiania parametrów RSS.
- OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 to zapytanie i zestaw OID używany do konfigurowania parametrów jednostki skalowania, takich jak liczba kolejek, liczba ITE, włączenie/wyłączenie funkcji RSS i aktualizacje klucza skrótu.
- OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES to metoda OID używana do modyfikowania wpisów tabeli pośredniej.
Obsługa OID-ów RSSv2
OID_GEN_RECEIVE_SCALE_PARAMETERS służy tylko do zapytania o bieżące parametry RSS danej jednostki skalowania. W systemie RSSv1 ten identyfikator OID jest używany do ustawiania parametrów. W przypadku sterowników miniportów obsługujących protokół RSSv2 usługa NDIS automatycznie wykonuje tę konwersję roli dla sterownika i wystawia następujące dwa identyfikatory OID w celu ustawienia parametrów.
OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 jest zwykłym identyfikatorem OID i jest obsługiwany tak samo jak obsługiwano identyfikator OID OID_GEN_RECEIVE_SCALE_PARAMETERS w RSSv1. Ten identyfikator OID nie jest widoczny dla sterowników filtrów NDIS o lekkiej wadze (LWF) przed NDIS 6.80.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIESjednak jest synchronicznym OID, który nie może zwrócić NDIS_STATUS_PENDING. Ten identyfikator OID musi zostać wykonany i ukończony w kontekście procesora, który zainicjował ten identyfikator OID. Podobnie jak OID_GEN_RECEIVE_SCALE_PARAMETERS_V2, nie jest również widoczny dla NDIS LWFs przed NDIS 6.80. Pliki LWFs w systemie NDIS 6.80 lub nowszym nie mogą opóźnić tego OID ani przenieść się do innego procesora. Ładunek zawiera tablicę prostych operacji "przenieś ITE", z których każda zawiera polecenie przeniesienia pojedynczego ITE dla jednostki skalującej do innego docelowego procesora CPU. Elementy tablicy mogą odwoływać się do różnych jednostek skalowania (VPorts).
Każdy typ sterownika NDIS: miniport, filtr i protokół, ma punkty wejściowe do obsługi interfejsu żądań synchronicznych OID.
Typ sterownika NDIS | Synchroniczna obsługa identyfikatorów OID | Funkcja tworzenia synchronicznych identyfikatorów obiektowych |
---|---|---|
Miniport | MiniportSynchronousOidRequest | N/A |
Filtr | NdisFSynchronousOidRequest | |
Protokół | N/A | NdisSynchronousOidRequest |
Przejścia stanu RSS, aktualizacje ITE i procesory podstawowe/domyślne
Parametry układu kierowniczego
W systemie RSSv2 różne parametry są używane do kierowania ruchu do poprawnego procesora CPU w zależności od stanu RSS (włączone lub wyłączone). Gdy funkcja RSS jest wyłączona, tylko procesor podstawowy jest używany do kierowania ruchem. Gdy funkcja RSS jest włączona, zarówno domyślny procesor, jak i wszystkie ITE są używane do kierowania ruchem. Te parametry sterowania są oznaczone jako "aktywne" lub "nieaktywne", podsumowane w poniższej tabeli:
Parametr sterujący | Funkcja RSS jest wyłączona | Włączono funkcję RSS |
---|---|---|
Procesor podstawowy | Aktywny | Nieaktywny |
Procesor domyślny | Nieaktywny | Aktywny |
ITE[0..N] | Nieaktywny | Aktywny |
Gdy parametr sterujący znajduje się w aktywnym stanie , kieruje ruch. Od momentu przejścia stanu RSS, które powoduje, że parametr staje się nieaktywny, sterowniki miniportu muszą śledzić zmiany tego parametru aż do momentu, gdy odwrotne przejście ponownie go aktywuje. Oznacza to, że sterownik miniportu musi śledzić wszystkie aktualizacje procesora domyślnego oraz wpisów w tabeli pośredniej, podczas gdy funkcja RSS jest wyłączona dla tej jednostki skalowania. Po włączeniu funkcji RSS bieżący stan śledzony dla domyślnego procesora i tabeli pośredniej powinien obowiązywać.
Rozważmy na przykład scenariusz, w przypadku gdy program vRSS jest już włączony. W tym przypadku tabela pośrednia już istnieje w protokole warstwy górnej i jest aktywnie używana przez kod rozprzestrzeniania używany przez oprogramowanie warstwy górnej. Jeśli podczas włączania funkcji RSS sprzętu wszystkie wpisy zaczną wskazywać na procesor podstawowy, zanim aktualizacje do przeniosą wpisy tabeli pośredniej, które są następnie wydawane i wykonywane przez sprzęt, procesor podstawowy może napotkać krótkie zakłócenie. Jeśli sterownik miniportu śledził domyślny procesor i informacje ITE, może kierować ruch do miejsca, w którym jest już oczekiwany przez górną warstwę.
Podczas gdy sterowniki miniportu muszą śledzić wszystkie aktualizacje nieaktywnych parametrów sterujących, powinny odroczyć walidację tych parametrów do momentu, gdy zmiana stanu RSS podejmie próbę wprowadzenia tych parametrów aktywne. Na przykład, w przypadku rozprzestrzeniania oprogramowania, gdy sprzętowa funkcja RSS jest wyłączona, protokoły warstwy wyższej mogą używać dowolnego procesora do rozdzielania (w tym poza zestawem RSS karty sieciowej). Górne warstwy zapewniają, że w momencie przejścia stanu RSS wszystkie parametry nieaktywne są prawidłowe dla nowego stanu RSS. Jednak sterownik miniportu powinien nadal zweryfikować parametry i zakończyć przejście stanu RSS niepowodzeniem, jeśli wykryje, że którekolwiek ze śledzonych nieaktywnych parametrów kierowania są nieprawidłowe.
Początkowy stan i aktualizacje parametrów sterujących
W poniższej tabeli opisano początkowy stan jednostki skalowania po utworzeniu (na przykład po utworzeniu usługi VPort), a także sposób aktualizowania parametrów:
Parametr | Opis |
---|---|
Procesor podstawowy |
|
Procesor domyślny |
|
Tabela pośrednia |
|
Aktualizacje procesorów ITE i procesorów podstawowych/domyślnych (przy użyciu OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES) są wywoływane z procesora, do którego obecnie wskazuje odpowiedni wpis. W przypadku danego wirtualnego portu warstwa nadrzędna gwarantuje, że w tych okolicznościach nie zostaną wydane żadne operacyjne identyfikatory OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES dla przeniesienia wpisów tablicy podsieci (ITE) lub ustawienie procesorów podstawowych/domyślnych.
- Podczas gdy OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 jest w toku.
- Po zainicjowaniu sekwencji usuwania VPort. Na przykład, górna warstwa wydaje polecenie ustawienia filtru OID dopiero po ukończeniu ostatniego identyfikatora OID przenoszącego ITE.
Wyłączanie funkcji RSS
Podczas wyłączania funkcji RSS protokół górnej warstwy może wskazać wszystkie elementy ITE procesorowi podstawowemu, a następnie wydać identyfikator OID, aby wyłączyć funkcję RSS, albo pozostawić tabelę pośrednią as-is i wyłączyć funkcję RSS. W obu przypadkach ruch sieciowy powinien być kierowany do procesora podstawowego.
RsSv2 utrzymuje wymaganie od RSSv1, które zezwala górnemu protokołowi warstwy na usunięcie portu VPort bez uprzedniego wyłączenia funkcji RSS. Górna warstwa może ustawić filtr odbioru na VPort na zero, co zapewnia, że żaden ruch odbiorczy nie przepływa przez VPort, a następnie przystąpić do usuwania VPort bez wyłączania RSS. Górna warstwa gwarantuje, że żadne OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES identyfikatory OID nie zostaną wydane podczas lub po usunięciu VPort.
Podczas wyłączania funkcji RSS i usuwania funkcji VPort sterownik miniportu powinien dbać o wszelkie oczekujące operacje wewnętrzne, które mogą istnieć z powodu poprzednich ruchów kolejki.
Różnice RSSv2
Protokół nadrzędny zapewnia, że ważne inwarianty nie są naruszone przed wykonaniem funkcji zarządzania lub ruchów ITE. Na przykład:
- Przed zmniejszeniem liczby kolejek górna warstwa gwarantuje, że tabela pośrednia nie odwołuje się do większej liczby procesorów niż nowa liczba kolejek dla portu VPort.
- Górna warstwa nie powinna żądać aktualizacji tabeli pośredniej, która narusza obecnie skonfigurowaną liczbę kolejek dla portu VPort. Sterownik miniportu powinien wymuszać tę regułę i zwracać błąd.
- Przed zmianą liczby wpisów tabeli pośredniej dla kart VMMQ-RESTRICTED górna warstwa gwarantuje, że zawartość tabeli pośredniej jest znormalizowana do potęgi 2.
Powiązane linki
OID_GEN_RECEIVE_SCALE_PARAMETERS_V2