サポートされている ENI (Elastic Network Interface) で RSS (受信側スケーリング) のハッシュルールと間接参照テーブルをカスタマイズすることで、トラフィックを CPU コア全体に均等に分散させ、シングルコアボトルネックを解消します。
RSS とは
受信側スケーリング (RSS) は、ENI のハードウェアとドライバーを使用して、パケットの特性 (ソース/デスティネーション IP アドレスとポート) からハッシュ値を計算し、異なるトラフィックストリームを複数の RX キューにマッピングします。バインドされた CPU コアがキューを並列処理することで、負荷分散を実現し、シングルコアのレイテンシーを削減します。
複数のキューをサポートする ENI は、並列処理のために、キューごとに独立した RX (受信) チャネルと TX (送信) チャネルを使用します。パケットが到着すると、ENI のハードウェアは RSS ポリシーを使用して、さまざまなデータストリームを複数の RX キューに分散させます。デフォルトでは、ECS インスタンスの RSS ポリシーは Virtual Private Cloud (VPC) で固定されており、インスタンス内から表示または変更することはできません。
一部のインスタンスファミリーは、ENI のカスタム RSS 機能をサポートしています。サポートされているインスタンスファミリーでカスタム RSS 機能を有効にすると、ENI は デフォルトのカスタムハッシュルール に基づいてトラフィックを分散します。また、実際のトラフィックの特性に基づいて RSS 設定をさらに調整することもできます。
カスタム RSS を有効にした後、DPDK シナリオで RSS を設定することで、マルチコアのパフォーマンスを最大化することもできます。
仕組み
Elastic Compute Service (ECS) インスタンス ENI のカスタム受信側スケーリング (RSS) は、次のように動作します。
-
ハッシュ値の計算:ENI は、5 タプル (送信元 IP、宛先 IP、送信元ポート、宛先ポート、プロトコル)、ハッシュキー、およびハッシュアルゴリズムからハッシュ値を計算します。
-
ハッシュキー:固定の
40バイト値です。ENI ドライバーは、初期化時にデフォルトのハッシュキーを生成します。ハッシュキーを調整する ことで、トラフィック分散に影響を与えることができます。 -
ハッシュアルゴリズム:現在、デフォルトの
toeplitzアルゴリズムのみがサポートされています。この設定は変更できません。 -
ハッシュルール:ハッシュ値を計算するルールは、トラフィックタイプによって異なります。ECS ENI RSS のデフォルトのハッシュルールは次のとおりです。
-
IPv4/IPv6 における TCP および UDP トラフィック:4 タプル (送信元 IP、宛先 IP、送信元ポート、宛先ポート) とハッシュキーに基づいてハッシュ値が計算されます。
-
ICMP などの IPv4/IPv6 における非 TCP/UDP トラフィック:2 タプル (送信元 IP と宛先 IP) とハッシュキーに基づいてハッシュ値が計算されます。
-
非 IP メッセージ (ARP など) はデフォルトキュー (キュー 0) に送信され、ハッシュ化されません。
-
-
-
間接参照テーブルのマッピング:RSS 間接参照テーブルは、ハッシュ値を宛先受信キューにマッピングする事前定義された配列です。各要素 (ハッシュバケット) には、0、1、2 などのキュー番号が格納されます。ENI ドライバーは、読み込み時に、トラフィックを均等に分散する間接参照テーブルを自動的に生成します。
-
間接参照テーブルの長さ:値は
128に固定されています。 -
分散モード:
RSS 間接参照テーブルの分散モードは、ハッシュ値を特定の受信キューにマッピングする中核となるメカニズムです。事前定義された間接参照テーブルを使用して、ハッシュ計算の結果がキューインデックスに変換されます。これにより、複数のコアにわたる柔軟なトラフィック分散が可能になります。
一様分布や重み付き分布などの異なる分散モードは、トラフィックが CPU コア全体にどのように分散されるかに直接影響します。これにより、システムのスループット、レイテンシー、リソース使用率、およびサービスのパフォーマンスに影響を与えます。
シナリオに基づいて、適切な分散パターンを選択してください。「間接参照テーブルの分散パターン」をご参照ください。
-
間接参照テーブルのマッピングプロセス:
-
ハッシュバケットインデックスの計算:
インデックス = ハッシュ値 % 間接参照テーブルの長さ(例: 88 % 128 → インデックス 88)。RSS 計算スクリプト を使用して、インデックス値を計算できます。 -
キュー番号の書き込み:分散モードに基づいて、各ハッシュバケットにキュー番号を書き込みます。
間接参照テーブルが生成されると、各パケットのハッシュインデックスがキュー番号にマッピングされ、パケットはそのキューに送信されます。
-
-
-
CPU コアバインディング:キューがパケットを受信すると、割り込みが発生します。バインドされた CPU コアが割り込みを処理します。
Red Hat Enterprise Linux 以外のイメージは、デフォルトでネットワーク割り込みアフィニティをサポートしています。各キューは独立した割り込みに関連付けられており、割り込みアフィニティが処理を異なる CPU コアに分散します。「マルチキューのコアメカニズム」をご参照ください。
ENI のカスタム RSS の有効化または無効化
ENI のカスタム RSS 機能は招待制プレビューです。この機能を使用するには、チケットを送信してください。
サポートされているインスタンスタイプでカスタム RSS を有効化すると、受信したトラフィックはデフォルトのハッシュルールに基づいて複数の受信キューに分散されます。異なる CPU コアがキューを並列に処理することで、スループットが向上し、シングルコアの負荷が低減します。
前提条件
-
カスタム RSS は段階的に展開されています。次のリージョンで利用できます:
リージョン名
リージョン ID
中国 (香港)
cn-hongkong
-
カスタム RSS をサポートするのは、一部のマルチキューインスタンスファミリーのみです。これには、汎用インスタンスファミリー g9i と メモリ最適化インスタンスファミリー r9i が含まれます。
サポート状況を確認するには、DescribeInstanceTypes API を呼び出します。 RssSupport=true の場合、この機能がサポートされています。
-
Alibaba Cloud Linux 3.2104 LTS 64-bit イメージを推奨します。
-
他のパブリックイメージを使用する場合、カーネルバージョンは 6.12 以降である必要があります。
-
DPDK アプリケーションでカスタム RSS 機能を使用する場合、DPDK バージョンは 21.11 以降である必要があります。
-
有効化または無効化の方法
カスタム RSS は デフォルトで無効 です。ENI の作成時、または ENI の作成後に有効化または無効化できます。
-
CreateNetworkInterface API を呼び出す際に、 EnhancedNetwork の EnableRss を true または false に設定します。
カスタム RSS は、ENI がインスタンスにアタッチされた後に有効になります。
-
ModifyNetworkInterfaceAttribute API を呼び出して、 EnhancedNetwork の EnableRss を true または false に設定します。 有効化または無効化 した後、変更は ENI が 再アタッチ されたときに有効になります:
-
インスタンスにアタッチされているセカンダリ ENI の場合、変更を有効にするには、ENI をデタッチしてから、ENI をアタッチする必要があります。
-
プライマリ ENI の場合、変更を有効にするには、インスタンスを再起動する必要があります。
-
-
カスタム RSS が有効かどうかを照会するには、 Attribute を enhancedNetwork に設定して DescribeNetworkInterfaceAttribute API を呼び出します。 EnableRSS=true は有効、false は無効を示します。
ENI の RSS が変更されていない場合、この API は EnableRSS パラメータを返しません。この場合、機能は有効になっていません。
ENI の RSS 設定の確認
カスタム RSS を有効にすると、ENI のリロード時に、ENI ドライバーはデフォルトのメカニズムとルールに基づいてデフォルトの RSS 設定を生成します。
Linux インスタンスにリモートでログオンし、ethtool -x eth0 を実行してプライマリ ENI の RSS 設定を表示できます。 セカンダリ ENI の場合、インターフェイス識別子 (eth1、eth2 など) を置き換えます。

-
ハッシュテーブル (RX フローハッシュインダイレクションテーブル):ハッシュ値から 64 個の受信キューへのマッピングルールを定義します。
-
ハッシュテーブルの各行は、開始インデックスで示されるハッシュ値の範囲を表します。たとえば、0 はハッシュ値 0~7 を示し、8 は 8~15 を示します。
-
テーブル内の数字 (0、1、2 など) は、対応する受信キューの ID を表します。この例では、64 個のキュー (0~63) があります。
-
現在の構成: インダイレクションテーブルは、シーケンス
0,1,2,...,63,0,1,2...63で周期的に埋められます。これにより、ハッシュ値が 64 個のキューに均等にマッピングされ、トラフィックが均等に分散されることが保証されます。
-
-
RSS ハッシュキー:ハッシュ値を計算するために使用するキーです。16 進数の文字は 40 バイトのキーを表します。
-
RSS ハッシュ関数:ハッシュ値を計算するためのアルゴリズムを定義します。
-
toeplitz:デフォルトのアルゴリズムであり、現在有効です。5 タプルに基づく対称ハッシュをサポートしており、汎用トラフィックに適しています。 -
xor/crc32: これらは、通常、特定のシナリオで使用されるその他のオプションのアルゴリズムです。 ECS は現在、toeplitzアルゴリズムのみをサポートしており、その他のアルゴリズムはサポートされていません。
-
-
ハッシュルール:プライマリ ENI が受信するトラフィックのハッシュフィールド設定の表示
ethtool -n eth0 rx-flow-hash tcp4-
tcp4を、udp4、tcp6、udp6など、クエリしたいプロトコルタイプに置き換えることができます。 -
ECS ENI RSS の デフォルト のハッシュルールは次のとおりです。これらのルールは変更できません。
-
IPv4/IPv6 における TCP および UDP トラフィック:4 タプル (送信元 IP、宛先 IP、送信元ポート、宛先ポート) とハッシュキーに基づいてハッシュ値が計算されます。
-
ICMP などの IPv4/IPv6 における非 TCP/UDP トラフィック:2 タプル (送信元 IP と宛先 IP) とハッシュキーに基づいてハッシュ値が計算されます。
-
非 IP メッセージ (ARP など) はデフォルトキュー (キュー 0) に送信され、ハッシュ化されません。
-
-
tcp4を例に取ると、IPv4 TCP トラフィックの場合、ハッシュ値はデフォルトで 4 タプル (送信元 IP、宛先 IP アドレス、送信元ポート、宛先ポート) とハッシュキーに基づいて計算されます。
予想されるトラフィックの特性は次のとおりです:
-
同じ TCP 接続:すべてのパケットが同じハッシュ値を持ち、同じキューに分散されます。これにより、パケットの順序が保証されます。
-
異なる TCP 接続:4 タプルが異なれば、ハッシュ値も異なります。トラフィックは異なるキューに分散されます。これにより、複数の CPU コアが異なる接続を並列処理でき、スループットが向上します。
-
-
次のメッセージが返された場合、カスタム RSS は 有効になっていない か、インスタンスタイプがそれを サポートしていません。インスタンスタイプがサポートしていることを確認した後、カスタム RSS を有効にしてください。

ENI のカスタム RSS の設定
デフォルトの RSS 設定はほとんどの要件を満たします。次のような状況では、ハッシュキーまたは間接参照テーブルの調整が必要な場合があります。
-
不均一なトラフィック:デフォルトのハッシュ値により、特定のトラフィックが少数のキューに集中する可能性があります。
-
パフォーマンスの最適化:UDP の割合が高い場合など、トラフィックの特性に基づいてハッシュルールを調整し、キューの使用率を向上させます。
-
セキュリティ要件:カスタムハッシュキーを使用して、攻撃者がトラフィック分散を予測できないようにします。
-
この例では、インスタンスは
Alibaba Cloud Linux 3.2104 LTS 64-bitイメージで構成されています。 -
この例では、プライマリ ENI
eth0を使用しています。対応するセカンダリ ENI の RSS を変更する場合は、インターフェイス識別子を eth1 または eth2 に置き換えてください。 -
RSS 設定がトラフィックの特性と一致しない場合、不均一な分散やコア間の状態競合が発生し、パフォーマンスに影響を与える可能性があります。実際のトラフィック特性に基づいて調整し、監視ツールを使用してキューの分散をリアルタイムで観察してください。
ハッシュキーの設定
トラフィックが不均一に分散されている場合 (たとえば、一部のキューの rx_packets が他のキューよりも著しく多い場合)、または攻撃者がハッシュ値をリバースエンジニアリングしてトラフィックパターンを推測するのを防ぐために、RSS ハッシュキーを再生成します。
キーを変更すると、既存の接続のハッシュ値が変更され、一時的なパケットリオーダリングまたは再送が発生する可能性があります。オフピーク時に実行してください。
-
ENI の現在のハッシュキーを表示します。
ENI ドライバーは、ENI の読み込み時に 40 バイトのデフォルトハッシュキーを生成します。
ethtool -x eth0
-
OpenSSL を使用して新しいランダムキーを生成します。
openssl rand -hex 40 | fold -w2 | paste -sd: - -
新しいキーを ENI に適用します。
重要これは一時的な設定です。インスタンスの再起動または ENI の再アタッチ後は無効になります。ENI ドライバーは、ランダムなデフォルト設定を自動的に初期化します。
sudo ethtool -X eth0 hkey <hash key><hash key> を、前の手順で生成した新しいキーに置き換えてください。
-
新しいキーが有効になったことを確認します。
ethtool -x eth0出力には、新しいキーが有効になったことが示されます。

間接参照テーブルの設定
RSS 間接参照テーブルの分散モードは、ハッシュ値を特定の受信キューにマッピングする中核となるメカニズムです。事前定義された間接参照テーブルを使用して、ハッシュ計算の結果がキューインデックスに変換されます。これにより、複数のコアにわたる柔軟なトラフィック分散が可能になります。
一様分布や重み付き分布などの異なる分散モードは、トラフィックが CPU コア全体にどのように分散されるかに直接影響します。これにより、システムのスループット、レイテンシー、リソース使用率、およびサービスのパフォーマンスに影響を与えます。
シナリオに基づいて分散モードを選択してください。
以下の設定は一時的なものです。インスタンスの再起動または ENI の再アタッチ後は無効になります。ENI ドライバーは、ランダムなデフォルト設定を再初期化します。
-
一様分布モード:最初の N 個のキューがハッシュバケットをループで埋めます。一般的な高並行性 シナリオに適しています。
sudo ethtool -X eth0 equal <Number of queues N>値が 64 に設定されている場合、間接参照テーブルは
0、1、2、...、63、0、1、2、...、63でループ状に埋められます。
-
重み付き分布:重み比率に基づいてハッシュバケットを割り当てます。差別化されたビジネス優先度 のシナリオ (たとえば、キュー 0 がリアルタイムトラフィックを処理し、キュー 1 がバックグラウンドタスクを処理する場合) や、混合 CPU パフォーマンスに適しています。
ethtool -X eth0 weight <queue 0 weight> <queue 1 weight> ...次の例では、キュー 0 に 60%、キュー 1 に 40% が割り当てられます。
説明合計で 4 つのキューがある場合でも、2 つのキューにのみ重みを設定した場合、間接参照テーブルはキュー 0 とキュー 1 のマッピングのみを生成します。
sudo ethtool -X eth0 weight 6 4
-
部分キュー分散:指定されたキューから開始して、連続するキューを使用してハッシュバケットをループで埋めます。NUMA ノードなど、特定の CPU 範囲にトラフィックを誘導する 場合に適しています。
ethtool -X eth0 start <start queue> equal <number of queues>次の例では、キュー 2~41 (キュー 2 から開始する 40 個のキュー) がハッシュバケットを埋めます。
sudo ethtool -X eth0 start 2 equal 40
watch コマンドを使用したトラフィック分散の観察
ENI でカスタム RSS を有効にした後、hping3 でさまざまな特性を持つトラフィックを生成し、watch でキューの割り込み分散を監視することで、トラフィックが期待どおりに複数のコアに分散されているかどうかを確認します。
前提条件
次の構成で 2 つの Elastic Compute Service (ECS) インスタンスを用意します。
-
送信側 ECS インスタンス (10.0.0.252): さまざまな特性を持つトラフィックを生成するために
hping3がインストールされたインスタンス。 -
受信側 ECS インスタンス: ENI のマルチキューをサポートするインスタンスタイプで、セカンダリ ENI がアタッチされ (10.0.0.5) 、セカンダリ ENI eth1 でカスタム RSS が有効化されています。
説明-
この例では、テスト用に 4 つのキューを使用します。
-
プライマリ ENI への SSH ログインによるトラフィックの影響を避けるため、テストはセカンダリ ENI eth1 でカスタム RSS を有効にして実施します。
-
-
ネットワーク接続: 2 つの ECS インスタンスは同じセキュリティグループ内にあり、内部ネットワーク経由で相互に通信できます。
操作手順
-
受信側 ECS インスタンスにログインし、セカンダリ ENI の RSS 設定と、期待されるトラフィック分散を確認します。詳細については、「ENI の RSS 設定の確認」をご参照ください。

-
送信側 ECS インスタンスにログインし、
hping3をインストールします。yum install -y hping3 -
受信側 ECS インスタンスで、キューのパケット数をリアルタイムで監視します。
watch -n 1 "ethtool -S eth1 | grep rx[0,1,2,3]_packets"キュー番号の設定を、受信側 ENI の実際の設定に置き換えてください。
-
送信側 ECS インスタンスにログインし、さまざまなトラフィックパターンをシミュレートします。
-
シナリオ 1: ランダムな宛先 IP アドレスを使用して、受信側 IP アドレスに 10,000 個の SYN パケットを高速で送信します。これにより、トラフィックハッシュを分散させ、ハッシュバランシングを検証します。
sudo hping3 10.0.0.5 -S -a 10.0.0.252 --rand-dest -p 0 --baseport 10000 -c 10000 -i u100 -I eth0-
rand-dest: ランダムな宛先 IP アドレス -
-p 0:rand-destと併用 -
--baseport 10000: 送信元ポートの開始値。 -
-c 10000: 10,000 個のパケットを送信 -
-i u100: 高速送信のため、パケット間の間隔を 100 マイクロ秒に指定します。 -
-I eth0:rand-destと併用して、送信元のネットワークインターフェースを指定
受信側インスタンスでは、4 つのキューのパケット数が均等に増加します。

-
-
シナリオ 2: 送信元 IP アドレスとポートを固定してトラフィックを送信します。これにより、同じトラフィック が同じキューにマッピングされるかをテストし、ハッシュの一貫性を検証します。
次のコマンドは、送信元 IP を
10.0.0.252、送信元ポートを12345に固定し、ターゲット10.0.0.5:80に 10,000 個の TCP SYN パケットを送信します。sudo hping3 10.0.0.5 -S -p 80 -c 10000 -s 12345 -a 10.0.0.252 --keep -i u100-
ハッシュインデックス値は、RSS スクリプトに基づいて計算されます。トラフィックはキュー 0 で処理されます。

-
受信側 ECS インスタンス (10.0.0.5) での実際の観察結果:

-
-
-
トラフィック分散が期待どおりでない場合 (たとえば、あるキューのロードが著しく高い場合) 、ハッシュキーを調整するか、インダイレクションテーブルを設定して最適化します。
DPDK での RSS の設定と使用
Data Plane Development Kit (DPDK) は、ユーザーモードドライバー、ゼロコピー、ポーリングモードを使用してほぼライン速度のパケット処理を実現する、オープンソースのユーザーモードデータプレーン高速化フレームワークです。通信クラウド、金融テクノロジー、エッジコンピューティングなど、スループットとレイテンシーが重視される領域に適しています。詳細については、「Data Plane Development Kit (DPDK*)」をご参照ください。
Elastic Network Interface (ENI) でカスタム受信側スケーリング (RSS) を有効にした後、DPDK の testpmd と l3fwd を使用して、RSS 分散をテストおよび検証できます。
ECS インスタンスへの DPDK のインストールと設定
-
DPDK アプリケーションでカスタム RSS 機能を使用する場合、DPDK バージョンは 21.11 以降である必要があります。
-
このトピックでは、
Alibaba Cloud Linux 3.2104 LTS 64-bitイメージを実行するecs.r9i.16xlargeインスタンス (64 キュー) を使用して、DPDK バージョン22.11.3のインストールを例として説明します。 -
この例では、プライマリ ENI
eth0を使用しています。対応するセカンダリ ENI の RSS を変更する場合は、インターフェイス識別子を eth1 または eth2 に置き換えてください。
ステップ1: DPDK のインストール
ステップ2: カーネルモジュールの読み込み
DPDK は、ユーザーモードデバイスアクセスのために UIO や Virtual Function I/O (VFIO) などのカーネルモジュールを必要とします。VFIO はセキュリティ (Input-Output Memory Management Unit (IOMMU) に依存するため) の観点から推奨されますが、UIO は迅速なテストに適しています。この例では VFIO を使用します。
-
IOMMU を有効にします。
VFIO は、安全なユーザーモードデバイスバインディングと DMA マッピングのために IOMMU に依存しています。
-
ファイルを開きます。
sudo vim /etc/default/grub -
iを押して挿入モードに入ります。intel_iommu=onをGRUB_CMDLINE_LINUXパラメーターに追加します。ファイルを保存して閉じます。変更後の設定例:

-
設定を適用します。
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-
インスタンスを再起動し、起動後に再接続します。
reboot警告再起動操作により、インスタンスが短時間停止し、インスタンスで実行されているサービスが中断される可能性があります。 オフピーク時にインスタンスを再起動することを推奨します。
-
-
VFIO および VFIO-PCI ドライバーを読み込みます。
sudo modprobe vfio && \ sudo modprobe vfio-pci -
noiommu_modeを有効にします。sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'
ステップ3: ENI を DPDK ドライバーにバインド
-
DPDK が引き継ぐ ENI でカスタム RSS が有効になっており、変更を有効にするために ENI が再アタッチされていることを確認してください。
-
-
この例ではプライマリ ENI を使用します。後続の操作で ENI がデタッチされるため、SSH セッションが中断されます。
-
セカンダリ ENI を操作する場合は、代わりにWorkbench (プライマリ ENI) を使用して接続してください。
-
-
PCI デバイスドライバーのバインディング状態を表示します。デフォルトでは、ENI はカーネルによって管理されています。
dpdk-devbind.py --status
-
デバイス
0000:00:05.0はvirtio-pciカーネルドライバーによって管理されており、eth0はアクティブです。 -
デバイスは、DPDK ユーザーモードのテイクオーバー用に
vfio-pciに切り替えることができます。まず、インターフェイスを無効にし、カーネルドライバーをデタッチします。
-
-
eth0 を非アクティブ化します。
sudo ip link set dev eth0 downこの手順をスキップすると、VFIO へのバインディングが失敗します。

-
カーネルドライバーをアンバインドし、VFIO にバインドします。
dpdk-devbind.py -b vfio-pci 0000:00:05.0PCI デバイス識別子を、お使いの ENI について照会した値に置き換えてください。
説明カーネルドライバーを再バインドするには、
sudo pkill dpdk-appで DPDK アプリケーションを停止し、dpdk-devbind.py -b virtio-pci 0000:00:05.0を実行します。 -
PCI デバイスドライバーのバインディング状態を再度表示します。ENI は DPDK によって引き継がれているはずです。
重要ENI が DPDK ユーザーモードドライバーに引き継がれると、カーネルはそれを制御しなくなります。
ip aなどのコマンドでは、その情報を表示できません。dpdk-devbind.py --status
デバイス
0000:00:05.0はvfio-pciにバインドされました。
testpmd を使用した RSS の設定
Testpmd は、ENI ドライバー機能の検証とデータプレーンアプリケーションのデバッグのための DPDK テストツールです。詳細については、「Testpmd Runtime Functions」をご参照ください。
ENI 設定 (キュー数、RSS ルール、RETA テーブル) の変更は、パケット転送を開始または再起動した後にのみ有効になります。
-
DPDK testpmd パケット転送テストツールを起動します。
dpdk-testpmd -a 0000:00:05.0 --socket-mem 1024 -- -i --portmask=0x1 --rxq=64 --txq=64 --forward-mode=rxonly-
-a 0000:00:05.0は、PCI アドレス0000:00:05.0の ENI を DPDK にアタッチします。 PCI アドレスを検索するには、dpdk-devbind.py --statusを実行します。 -
--socket-mem 1024: NUMA ノードごとに 1024 MB のヒュージページメモリを事前割り当てします。 -
-i: 対話型コマンドラインモードを開始し、動的に設定を調整したり、統計情報を表示したりできるようにします。quitと入力して終了します。 -
--portmask=0x1:ポートマスク0x1(2進数0001) を有効にし、最初の ENI (PCI アドレス0000:00:05.0) のみを使用します。-
portmaskの各バイナリビットはポートに対応します (0x1はポート 0 を有効にし、0x3はポート 0 と 1 を有効にします)。 -
デバイス (
0000:00:05.0) が 1 つだけアタッチされているため、その DPDK ポート番号は 0 です。
-
-
--rxq=64/--txq=64: マルチキュー処理のために、ポートごとの RX および TX キュー数を 64 に設定します。64 を実際の ENI キュー数に置き換えます。 -
--forward-mode=rxonly:受信専用モード(パケットは受信後に破棄されます)。ENI の受信パフォーマンスのテスト、またはパケットキャプチャに使用されます。
-
-
対話モードに入り、現在の RSS 設定を照会します。
-
クエリ ハッシュ設定情報:
show port info <port_id>port_id: ポート。この例では、ポート 0 です。
-
クエリハッシュキー:
show port <port_id> rss-hash key
間接テーブル構成の照会:
show port <port_id> rss reta <size> <mask0, mask1...>-
size: クエリするインダイレクションテーブルのエントリー数。値は128に固定されています。 -
mask0, mask1:表示するハッシュインデックスの範囲を絞り込むためのマスクで、16 進数形式で指定されます。 例えば、mask0=0xffは、ハッシュインデックス 0 から 7 のエントリが表示されることを示します。間接テーブルのサイズは 128 に固定されています。2 つのマスクが必要で、それぞれが 64 個のインデックスブロックをカバーします。128 個すべてのインデックスとキューのマッピングを返すには、
show port 0 rss reta 128 (0xffffffffffffffff,0xffffffffffffffff)を実行します:
-
-
-
要件に基づいて RSS を設定します。
-
新しいハッシュキーを設定します。
port config <port_id> rss-hash-key (ipv4|ipv4-frag|\ ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|\ ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|\ ipv6-other|l2-payload|ipv6-ex|ipv6-tcp-ex|\ ipv6-udp-ex <string of hex digits \ (variable length, NIC dependent)>)IPv4 経由の TCP の場合、
port config 0 rss-hash-key ipv4 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FCを実行してハッシュキーを設定し、検証します:
-
ハッシュ値を指定されたキューにマッピングするために、RSS インダイレクションテーブルを設定します。
port config all rss reta <hash,queue>,<hash,queue>..実際のキュー数に基づいて設定してください。
-
hash: ハッシュインデックス。範囲はインダイレクションテーブルのサイズによって決まります (たとえば、64 エントリの場合は 0~63)。 -
queue: 対象の受信キュー番号。
-
-
l3fwd での RSS の適用
DPDK アプリケーションで RSS を有効にするには、コードにハッシュキーとインダイレクションテーブルの設定を実装します。以下では、L3FWD を例として使用します。
L3FWD (Layer 3 Forwarding) は、ゼロコピーとポーリングモードドライバー (PMD) を使用した高性能 IP ベースのパケットルーティングを実証する DPDK サンプルアプリケーションです。
-
DPDK の L3FWD ソースコード(
examples/l3fwd/main.c)を変更します。-
L3FWD サンプルコードのポート初期化セクション
static struct rte_eth_conf port_confを修正してください。 -
ハッシュインダイレクションテーブルとハッシュキーを設定する関数を追加します。
-
rte_eth_dev_startの後、新しい設定関数を呼び出します。
-
-
ソースコードを変更した後、L3FWD を再コンパイルします。
cd ~/dpdk-stable-22.11.3/ rm -rf build # ビルドディレクトリを初期化し、プロジェクトオプションを設定して、l3fwd レイヤー 3 転送のサンプルをビルドするように指定します。 meson setup -Dexamples=l3fwd build cd build # コンパイルします。 ninja # コンパイルされたファイルをシステムディレクトリにインストールします。 sudo ninja install # システムの共有ライブラリキャッシュを更新します。 sudo ldconfig -
ポート-キュー-コアのバインディングを指定し、L3FWD を起動します。
cd ~/dpdk-stable-22.11.3/build/examples ./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(PORT_ID, QUEUE_ID, LCORE_ID), (PORT_ID, QUEUE_ID, LCORE_ID), ..." --parse-ptype-
--config: 各 3 つ組は、以下を指定します。-
PORT_ID: ポート ID (0 から開始)。
-
QUEUE_ID: 受信キュー ID (0 から開始)。
-
LCORE_ID: 論理コア ID (0 から開始)。
-
-
次の例では、2 つのコアと 2 つのキューを使用します。
./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(0,0,0),(0,1,1)" --parse-ptype-
最初の 3つ組
(0,0,0)では、論理コア 0 (lcore0) がポート 0 のキュー 0 を処理します。 -
2つ目の 3つ組
(0,1,1):論理コア 1 (lcore1) がポート 0 のキュー 1 を処理します。

-
-
RSS スクリプトによるハッシュインデックスの計算
この Python スクリプトを使用して、4 タプルとハッシュキーを指定し、パケットがマッピングされる受信キューを計算します。この計算結果は、特定のフローを指定のキューに誘導するためのインダイレクションテーブル設定のガイドとなります。
次の例では、キュー数が 64 の ENI の RSS 設定を使用します。

次の 5 タプル情報を使用し、スクリプトで RSS ハッシュ値を計算します。値は必要に応じて変更してください。
-
宛先 IP アドレス (-r):10.0.0.1。これは、RSS が設定された受信側インスタンスの ENI の IP アドレスです。
-
送信元 IP アドレス (-t):10.0.0.251。これは、送信側の ENI の IP アドレスです。
-
宛先ポート (-R):
26000 -
送信元ポート (-T):
18042 -
ハッシュキー: RSS インダイレクションテーブル設定から取得します。
python ali_ecs_rss_calc.py -r 10.0.0.1 -t 10.0.0.251 -R 26000 -T 18042 -k 69:e8:7c:56:bf:03:9f:63:d7:c5:e5:96:b3:00:36:93:02:8c:d2:8f:cc:a9:00:65:fd:c8:94:71:5f:fd:c8:de:7a:30:a9:73:b3:33:0c:c6
スクリプトは、toeplitz アルゴリズムを使用してハッシュを計算します。以下の結果では、システムは長さが 128 の間接化テーブルを使用します。ハッシュインデックスが 117 の場合、パケットはインデックス 117 のキューにマップされます。

インダイレクションテーブルを見ると、インデックス 117 はキュー 53 にマッピングされているため、パケットはキュー 53 で処理されます。




