NetAdapterCx Receive Side Scaling (RSS)
Receive Side Scaling (RSS) ist eine Netzwerktreiber-Technologie, die eine effiziente Verteilung der Netzwerk-Empfangsverarbeitung auf mehrere CPUs in Multiprozessorsystemen ermöglicht. RSS verbessert die Systemleistung und erhöht die Skalierbarkeit des Netzwerks, indem es alle verfügbaren Prozessoren in einem System nutzt und die CPU-Workloads dynamisch ausgleicht.
Dieses Thema befasst sich mit RSS für NetAdapterCx Client-Treiber und setzt die Kenntnis der RSS-Konzepte und -Terminologie voraus. Weitere Informationen über RSS im Allgemeinen, einschließlich Diagrammen, die RSS in verschiedenen Hardwareszenarien veranschaulichen, finden Sie unter Receive Side Scaling.
Übersicht über RSS in NetAdapterCx
Der Schwerpunkt von RSS in NetAdapterCx liegt auf der einfachen Konfiguration, der einfachen Aktivierung und Deaktivierung und der Abstraktion der Komplexität zwischen Prozessor und Interrupt. Ein Client-Treiber für eine RSS-fähige NIC muss nur drei Kriterien erfüllen, um RSS in NetAdapterCx zu unterstützen:
- Der Treiber muss RSS-Funktionalitäten beim Starten eines Netzadapters festlegen, jedoch vor dem Aufruf von NetAdapterStart. Dazu gehört die Implementierung von vier RSS-Callbacks und deren Registrierung in der Struktur der RSS-Funktionalitäten.
- Die Datenpfad-Warteschlangen des Treibers müssen erstellt und bereit sein, Anfragen anzunehmen.
- Der Treiber muss sich im D0-Status befinden.
Das Design von RSS in NetAdapterCx garantiert, dass das System die RSS-Callbacks eines Clients erst ganz am Ende der Power-up-Sequenz aufruft und RSS aktiviert. Die Clients müssen sich erst dann um die Verschiebung von Indirection-Tabellen kümmern oder andere RSS-Ereignisse verarbeiten, wenn alles, was sie brauchen, bereit ist.
Später, wenn der Treiber entladen wird, ruft NetAdapterCx keine RSS-Callbacks mehr auf, nachdem die Warteschlangen während der Powerdown-Sequenz zerstört wurden. Da Datenpfad-Warteschlangen als erster Schritt während des Ausschaltens entfernt werden, bedeutet dies, dass die Clients mögliche RSS-Ereignisse in keiner anderen Phase des Ausschaltens behandeln müssen.
Festlegen der Funktionalitäten von RSS
Um mit RSS in NetAdapterCx zu beginnen, führen Sie die folgenden Schritte aus:
- Wenn Sie Ihren NetAdapter starten, teilen Sie dem System die Funktionalitäten und Einschränkungen Ihrer Hardware für RSS mit, indem Sie die Struktur NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES verwenden.
- Initialisieren Sie die Struktur der Funktionalitäten durch den Aufruf NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT.
- Wenn Sie die RSS-Funktionalitäten-Struktur initialisieren, legen Sie die RSS-Callback-Mitglieder der Struktur fest, um Ihre Implementierungen für diese Callbacks zu registrieren:
- Legen Sie den Wert SynchronizeSetIndirectionEntries der RSS-Funktionalitäten-Struktur entsprechend fest.
- Übergeben Sie die initialisierten RSS-Funktionalitäten an die Methode NetAdapterSetReceiveScalingCapabilities.
Aktivieren und Deaktivieren von RSS
Nachdem Sie die RSS-Funktionalitäten festgelegt haben, fährt das System mit der Power-Up-Sequenz für Ihren Treiber fort. NetAdapterCx beginnt damit, die RSS-Callbacks Ihres Treibers aufzurufen, sobald der letzte Schritt der Erstellung von Datenpfad-Warteschlangen abgeschlossen ist. Zu diesem Zeitpunkt kann RSS nach Bedarf vom System aktiviert und deaktiviert werden.
Wichtig
Sie sollten nicht Ihre Indirection-Tabelle löschen oder zurücksetzen, wenn Sie RSS aktivieren oder deaktivieren. Das Framework legt den Ausgangszustand Ihrer Indirection-Tabelle fest.
Aktivieren von RSS
NetAdapterCx aktiviert RSS, indem es den Callback EvtNetAdapterReceiveScalingEnable Ihres Treibers aufruft. Im Rahmen dieses Callbacks aktivieren Sie normalerweise die Steuerbits in Ihrer Hardware.
Ein Code-Beispiel für die Aktivierung von RSS finden Sie unter EvtNetAdapterReceiveScalingEnable.
Deaktivieren von RSS
NetAdapterCx deaktiviert RSS, indem es den Callback EvtNetAdapterReceiveScalingDisable Ihres Treibers aufruft. Hier deaktivieren Sie normalerweise das Steuerbit in Ihrer Hardware, das Sie zuvor in EvtNetAdapterReceiveScalingEnable festgelegt haben.
Ein Code-Beispiel für die Deaktivierung von RSS finden Sie unter EvtNetAdapterReceiveScalingDisable.
Festlegen des geheimen Hashing-Schlüssels
Sobald RSS aktiviert ist, ruft NetAdapterCx den Callback EvtNetAdapterReceiveScalingSetHashSecretKey auf, um Ihrem Treiber den geheimen Hash-Schlüssel mitzuteilen, den Ihre NIC bei der Überprüfung von Hash-Berechnungen verwenden soll. Dieser Callback kann jederzeit aufgerufen werden, wenn RSS ausgeführt wird und sich der geheime Hash-Schlüssel ändert.
Ein Code-Beispiel für das Festlegen des geheimen Hash-Schlüssels finden Sie unter EvtNetAdapterReceiveScalingSetHashSecretKey.
Verschieben von Indirection-Tabellen-Einträgen
Während RSS auf dem System ausgeführt wird, überwachen die Protokolltreiber der oberen Schicht die Workload der Prozessoren und pflegen eine Indirection-Tabelle, die die Zuordnung der Warteschlangen zu den Prozessoren vornimmt. Wenn der Protokolltreiber die Prozessorauslastung in RSS neu verteilen muss, berechnet er zunächst eine neue Zuordnung für jeden Eintrag in der Indirection-Tabelle zu einem neuen Prozessor. Anschließend übergibt das Protokoll diese Informationen an NetAdapterCx, das die komplexe Zuordnung von Warteschlangen und Hardware-Interrupt-Vektoren zum richtigen Prozessor für Ihren NIC-Client-Treiber übernimmt. NetAdapterCx speichert die neue Indirection-Tabelle mit den Einträgen, die den IDs der Warteschlangen zugeordnet sind, in einer NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Struktur und übergibt sie an Ihren Treiber, wenn es die Callback-Funktion EvtNetAdapterReceiveScalingSetIndirectionEntries aufruft.
In diesem Callback verschieben Sie jeden Eintrag in der Indirection-Tabelle Ihrer NIC in die angegebene Empfangswarteschlange. Jede NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY-Struktur im NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES-Array enthält den Hashing-Index für diesen Eintrag in der Tabelle, die neue Warteschlange, der der Eintrag zugewiesen werden soll, und ein Statusfeld, das angibt, ob diese individuelle Verschiebung erfolgreich war oder nicht.
Die Methode der Zuweisung von Indexeinträgen zu Hardware-Warteschlangen hängt vom Design Ihrer NIC und der Anzahl der Warteschlangen ab, über die sie verfügt. Weitere Informationen und ein Code-Beispiel finden Sie unter EvtNetAdapterReceiveScalingSetIndirectionEntries.
Unterstützung heterogener CPUs
Wichtig
Bei der Unterstützung heterogener CPUs handelt es sich um eine Funktion, die vor ihrer Veröffentlichung noch erheblich geändert werden kann. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Systeme mit heterogenen CPUs verwenden mehrere Arten von Kernen, die unterschiedliche Taktraten und Funktionen haben. Im Vergleich zu homogenen Multiprozessorsystemen, bei denen jeder Kern identisch ist, können sich Systeme mit heterogenen CPUs besser an dynamische Rechenlasten anpassen und verbrauchen weniger Energie.
Ab der WDK-Vorschau-Version 25197 bietet NetAdapterCx Unterstützung für Systeme mit heterogenen CPUs, indem die verschiedenen Core-Typen effizient genutzt werden. Während RSS ausgeführt wird, entscheidet das System je nach der vom Client Treiber empfangenen Datenverkehrs-Workload, welcher Prozessor verwendet werden soll. Wenn weniger Datenverkehr empfangen wird, können kleinere, energieeffizientere Kerne den Datenverkehr bewältigen. Bei hohem Datenverkehr werden größere, leistungsfähigere Kerne benötigt, um die empfangenen Pakete kontinuierlich abzufragen.
Um sich für die heterogene Systemunterstützung zu entscheiden, muss der Systemadministrator das standardisierte INF-Schlüsselwort *RSSProfile auf NdisRssProfileBalanced festlegen. Dies ist das Standardprofil für heterogene Systeme. Um dem System die Möglichkeit zu geben, zu entscheiden, welche Kerne am besten verwendet werden, können Sie keine erweiterten RSS-Schlüsselwörter festlegen.
Die anderen RSS-Profile werden auch für heterogene Systeme unterstützt. Wenn Sie erweiterte Einstellungen wie die RSS-Basisprozessoranzahl und die RSS-Maximalprozessoranzahl auf dem System steuern möchten, sollten Sie ein anderes RSS-Profil verwenden.
Sie können auch NdisRssProfileBalanced auf einem System mit homogener CPU verwenden. In diesem Fall entscheidet das System, welche Prozessoren für RSS verwendet werden sollen.