NetAdapterCx Receive Side Scaling (RSS)
Receive Side Scaling (RSS) は、マルチプロセッサ システムの複数の CPU 間でネットワーク受信処理を効率的に分散できるようにするネットワーク ドライバー テクノロジです。 RSS は、システムで使用可能なすべてのプロセッサを活用し、CPU ワークロードを動的に再調整することで、システム パフォーマンスを向上させ、ネットワークのスケーラビリティを向上させます。
このトピックでは、NetAdapterCx クライアント ドライバーの RSS について説明し、RSS の概念と用語に関する知識があることを前提としています。 さまざまなハードウェア シナリオでの RSS を示す図など、RSS 全般の詳細については、「Receive Side Scaling」を参照してください。
NetAdapterCx の RSS の概要
NetAdapterCx の RSS は、構成の容易さ、有効化と無効化の単純化、およびプロセッサから割り込みへの複雑さの抽象化に重点を置いています。 RSS 対応 NIC のクライアント ドライバーが実行する必要のあることは、NetAdapterCx で RSS をサポートするために、次の 3 つの条件を満たすのみです。
- ドライバーは、ネット アダプターを起動するとき、ただし、NetAdapterStartを呼び出す前に、RSS 機能を設定する必要があります。 これには、4 つの RSS コールバックの実装と、それらを RSS 機能構造に登録することが含まれます。
- ドライバーのデータパス キューが作成され、要求を受け入れる準備ができている必要があります。
- ドライバーは D0 の電源状態である必要があります。
NetAdapterCx の RSS の設計により、システムがクライアントの RSS コールバックを呼び出さず、power-up sequence の最後まで RSS を有効にすることが保証されます。 クライアントは、必要なすべての準備が整うまで、間接的なテーブル移動要求を管理したり、他の RSS イベントを処理したりする必要はありません。
その後、ドライバーがアンロードされているときに、パワー ダウン シーケンス 中に、データパス キューが破棄された後、NetAdapterCx は、RSS コールバックを呼び出しません。 データパス キューは電源切断時の最初のステップとして破棄される、クライアントは電源切断中に、他の段階で発生する可能性のある RSS イベントを処理する必要がありません。
RSS 機能の設定
NetAdapterCx で RSS の使用を開始するには、次の手順を実行します。
- ネットアダプタを起動するときに、NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES 構造体を使用して、ハードウェアの RSS 機能と制約をシステムに通知します。
- NET_ADAPTER_RECEIVE_SCALING_CAPABILITIES_INIT を呼び出して機能構造体を初期化します。
- RSS 機能構造体を初期化するときは、構造体の RSS コールバック メンバーを設定して、これらのコールバックの実装を登録します。
- 必要に応じて、RSS ケーパビリティ構造体の SynchronizeSetIndirectionEntries を設定します。
- 初期化された RSS 機能構造体を NetAdapterSetReceiveScalingCapabilities メソッドに渡します。
RSS の有効化と無効化
RSS 機能を設定すると、システムはドライバーの電源投入シーケンスを続行します。 NetAdapterCx は、データパス キューを作成する最後の手順が完了すると、ドライバーの RSS コールバックの呼び出しを開始します。 この時点で、RSS は、システムの必要に応じて、有効または無効にできます。
重要
RSS を有効または無効にするときは、間接テーブルをクリアまたはリセット しないでください。 フレームワークは、間接テーブルの初期状態を設定します。
RSS の有効化
NetAdapterCx は、ドライバーの EvtNetAdapterReceiveScalingEnable コールバックを呼び出すことで RSS を有効にします。 このコールバックのコンテキストでは、通常、ハードウェアで制御ビットを有効にします。
RSS を有効にするコード例については、「EvtNetAdapterReceiveScalingEnable」を参照してください。
RSS の無効化
NetAdapterCx は、ドライバーの EvtNetAdapterReceiveScalingDisable コールバックを呼び出すことで RSS を無効にします。 ここでは、通常、以前に EvtNetAdapterReceiveScalingEnable で設定したハードウェアの制御ビットを無効にします。
RSS を有効にするコード例については、「EvtNetAdapterReceiveScalingDisable」を参照してください。
ハッシュ秘密鍵の設定
RSS が有効になると、NetAdapterCx は EvtNetAdapterReceiveScalingSetHashSecretKey コールバックを呼び出して、NIC がハッシュ計算の検証に使用するハッシュ秘密キーをドライバーに提供します。 このコールバックは、RSS の実行中に、ハッシュ秘密鍵が変更されたとき、いつでも呼び出すことができます。
ハッシュ秘密鍵を設定するコード例については、EvtNetAdapterReceiveScalingSetHashSecretKey を参照してください。
間接テーブル エントリの移動
RSS がシステムで実行されている間、上位層のプロトコル ドライバーはプロセッサのワークロードを監視し、受信キューをプロセッサにマップする間接テーブルを維持します。 プロトコル ドライバーが RSS でプロセッサのワークロードを再調整する必要がある場合、最初に新しいプロセッサへの間接テーブル エントリごとに、新しいマッピングを計算します。 次に、プロトコルは、この情報を NetAdapterCx に渡し、NIC クライアント ドライバーの代わりに、適切なプロセッサに、受信キューとハードウェア割り込みベクターをマッピングする複雑さを処理します。 NetAdapterCx は、受信キュー ID にマップされたエントリを含む新しい間接テーブルを NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 構造体に格納し、EvtNetAdapterReceiveScalingSetIndirectionEntries コールバック関数を呼び出すときにドライバーに渡します。
このコールバックでは、NIC の間接テーブルの各エントリを、指定された受信キューに移動します。 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRIES 配列の各 NET_ADAPTER_RECEIVE_SCALING_INDIRECTION_ENTRY 構造体には、テーブル内のそのエントリのハッシュ インデックス、エントリを割り当てる新しい受信キューと、個々の移動が成功したかどうかを示すステータス フィールドが含まれています。
ハードウェア受信キューにインデックス エントリを割り当てる方法は、NIC の設計と受信キューの数によって異なります。 詳細とコード例については、「EvtNetAdapterReceiveScalingSetIndirectionEntries」を参照してください。
ヘテロジニアス CPU のサポート
重要
異種 CPU サポートはプレリリース機能であり、製品版がリリースされる前に大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
ヘテロジニアスCPUシステムは、クロック速度と機能の異なる複数のタイプのコアを使用します。 すべてのコアが互いに同一である同種マルチプロセッサ システムと比較して、ヘテロジニアス CPU システムは、動的なコンピューティング負荷により、適切に調整し、エネルギー消費量を減らすことができます。
WDK プレビュー バージョン 25197 以降、NetAdapterCx は、さまざまなコアの種類を効率的に利用することで、異種 CPU システムのサポートを提供します。 RSS の実行中、システムは、クライアント ドライバーが受信するトラフィック ワークロードに応じて、使用するプロセッサを決定します。 受信するトラフィックが少ない場合は、より小さく、より電力効率の高いコアで、トラフィックを処理できます。 トラフィックが多い場合は、受信するパケットを継続的にポーリングするために、より大きく、よりパフォーマンスの高いコアが必要になります。
異種システム サポートをオプトインするには、システム管理者は、 *RSSProfile standardized INF キーワード を NdisRssProfileBalanced に設定する必要があります。 これは、異種システムのデフォルト プロファイルです。 使用する最適なコアをシステムに決定させるため、RSS 詳細キーワードを設定することはできません。
その他の RSS プロファイルは、異種システムでもサポートされています。 システムの RSS ベース プロセッサ番号や RSS 最大プロセッサ番号などの詳細設定を制御する場合は、別の RSS プロファイルを使用する必要があります。
同種の CPU システムで NdisRssProfileBalanced を使用することもできます。 この場合、RSS に使用するプロセッサは、システムによって決まります。