パケット処理を複数の CPU コアに分散させることで、ネットワークスループットを向上させ、レイテンシーを削減します。
NIC マルチキューを使用する理由
単一キューのネットワークインターフェースは、すべてのパケットを 1 つの CPU コアで処理するため、CPU の過負荷、レイテンシーの増加、パケット損失を引き起こす可能性があります。NIC マルチキューは、トラフィックを複数のコアに分散させることで、リソース使用率を向上させます。
同じ PPS と帯域幅の条件下では、2 つのキューを使用すると、単一キューに比べてネットワークパフォーマンスが 50% から 100% 向上します。4 つのキューでは、さらに大きな効果が得られます:
-
マルチコア使用率の向上:トラフィックを CPU コア間に分散させることで、負荷を均等にし、使用率を高めます。
-
スループットの向上:パケットの並列処理により、特に高負荷時のスループットが向上します。
-
レイテンシーの削減:パケットを複数のキューに分散させることで、輻輳とレイテンシーを削減します。
-
パケット損失の削減:高トラフィック時に単一キューが過負荷になることによるパケット損失を防ぎます。
不適切な設定は、パフォーマンスを低下させる可能性があります。例えば、不正確なキュー数や CPU アフィニティの設定は不要なコンテキストスイッチを引き起こし、キュー数が少なすぎるとハードウェアリソースを十分に活用できません。
Elastic Network Interface (ENI) がインスタンスにアタッチされると、そのキュー数にはインスタンスタイプのデフォルト値が設定されます。キュー数を手動で調整するには、まずユースケースとハードウェアの状況を評価してください。
NIC マルチキューの仕組み
-
キューアーキテクチャ
ENI は複数の複合キューをサポートしており、各キューは独立した CPU コアによって処理されます。これにより、パケットの並列処理が可能になり、ロック競合が減少し、マルチコアのパフォーマンスを最大限に活用できます。
受信 (RX) キューと送信 (TX) キューは、パケット処理に使用される 2 種類のキューです。各複合キューは、1 つの RX キューと 1 つの TX キューで構成されます:
-
RX キュー:着信パケットを処理します。ネットワークインターフェースは、Receive Side Scaling (RSS) のルール (ラウンドロビンやフローベースのハッシュ化など) に基づいて、各パケットを特定の RX キューに分散します。
一部のインスタンスファミリーは、ENI のカスタム RSS をサポートしています。これは、ハッシュアルゴリズムを使用してトラフィックを異なる RX キューに分散します。
-
TX キュー:送信パケットを管理します。アプリケーションはパケットを TX キューに配置し、ネットワークインターフェースはシーケンスや優先度に基づいてパケットを送信します。
-
-
IRQ アフィニティのサポート
各キューには独立した割り込みがあります。IRQ アフィニティは、割り込み処理を CPU コア間に分散させることで、単一のコアが過負荷になるのを防ぎます。
Red Hat Enterprise Linux を除くすべてのパブリックイメージでは、IRQ アフィニティはデフォルトで有効になっています。詳細については、「IRQ アフィニティの設定」をご参照ください。
制限事項
-
NIC マルチキューをサポートしているのは、一部のインスタンスタイプのみです。「インスタンスファミリー」をご参照ください。 [Multi-queue] 列の値が 1 より大きい場合、そのインスタンスタイプは NIC マルチキューをサポートしています。
-
サポートされているインスタンスタイプでは、ENI をアタッチすると NIC マルチキューが自動的に有効になります。
-
インスタンスタイプに記載されているキュー数は、そのタイプがサポートする ENI あたりの最大キュー数です。
-
DescribeInstanceTypes API を InstanceTypeFamily パラメーターを指定して呼び出し、キュー関連のメトリクスを照会します:
-
デフォルトのキュー数
PrimaryEniQueueNumber:プライマリ ENI のデフォルトのキュー数です。SecondaryEniQueueNumber:セカンダリ ENI のデフォルトのキュー数です。
-
ENI あたりの最大キュー数
MaximumQueueNumberPerEni:インスタンスファミリーの ENI あたりの最大キュー数です。
-
合計キュークォータ
TotalEniQueueQuantity:インスタンスファミリーの合計キュークォータです。
-
-
-
カーネルバージョンが 2.6 より前のパブリックイメージは、NIC マルチキューをサポートしていない場合があります。最新のパブリックイメージを使用してください。
ENI のキュー数の表示
コンソールの使用
ECS コンソール - ENI に移動します。
上部メニューで、対象リソースのリージョンとリソースグループを選択します。
-
対象のセカンダリ ENI ID をクリックして、詳細ページを開きます。
-
キュー数 セクションで、[キュー] パラメーターを確認します。この値が現在のキュー数です。

-
キュー数を変更した場合、変更後の値が表示されます。
-
キュー数を変更していない場合:
-
ENI がインスタンスにアタッチされていない場合、値は表示されません。
-
ENI がインスタンスにアタッチされている場合、インスタンスタイプのデフォルトのキュー数が表示されます。
-
-
API の使用
DescribeNetworkInterfaceAttribute API を呼び出します。レスポンスパラメーター QueueNumber がキュー数を示します。
-
キュー数を変更した場合、変更後の値が表示されます。
-
キュー数を変更していない場合:
-
ENI がインスタンスにアタッチされていない場合、値は表示されません。
-
ENI がインスタンスにアタッチされている場合、インスタンスタイプのデフォルトのキュー数が表示されます。
-
インスタンス内での確認
-
Linux インスタンスに接続します。
説明Windows インスタンスの場合は、ECS コンソールまたは API を呼び出して ENI のキュー数を表示します。
-
ip aを使用してネットワーク設定を表示します:
-
プライマリ ENI eth0 が NIC マルチキューをサポートしているかどうかを確認します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を確認するには、識別子を eth1、eth2 などに置き換えます。
ethtool -l eth0出力を確認します:
-
「事前設定の最大値」の「Combined」が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値が 最大キュー数です。
-
「現在のハードウェア設定」の「Combined」が、現在使用中のキュー数です。
この例では、ENI は最大 3 つの複合 (RX+TX) キューをサポートし、現在 3 つを使用しています。

-
ENI に設定するキュー数を変更するには、「ENI のキュー数の変更」をご参照ください。
-
OS のキュー数を変更するには、「OS のキュー数の変更」をご参照ください。
-
ENI のキュー数の変更
ENI をインスタンスにアタッチすると、そのキュー数にはインスタンスタイプのデフォルト値が設定されます。コンソールまたは API を呼び出すことで調整できます。次の点にご注意ください:
-
キュー数を変更できるのは、ENI が 関連付け待ち な状態、またはインスタンスが 停止済み で バインド済み な状態の場合のみです。
-
キュー数は、インスタンスタイプの ENI あたりの最大キュー数を超えることはできません。
-
インスタンス上のすべての ENI の合計キュー数は、インスタンスタイプの合計キュークォータを超えることはできません。
コンソールの使用
ECS コンソール - ENI に移動します。
上部メニューで、対象リソースのリージョンとリソースグループを選択します。
-
対象のセカンダリ ENI ID をクリックして、詳細ページを開きます。
-
[キュー数の変更] をクリックします。

-
[OK] をクリックします。
API の使用
ModifyNetworkInterfaceAttribute API を呼び出し、QueueNumber パラメーターを設定してキュー数を変更します。
新しいキュー数は、アタッチされたインスタンスが次回起動したときに有効になります。
OS のキュー数の変更
ENI のキュー数を変更すると、OS は自動的に新しい設定を適用します。
また、ENI が 実際に使用する キューの数を調整することもできます。この値は、設定されたキュー数以下である必要があります。
-
OS が使用するキュー数を変更しても、ENI に設定されたキュー数には影響せず、コンソールや API のレスポンスにも表示されません。
-
この変更は一時的なものであり、インスタンスを再起動すると維持されません。
以下の例では、NIC マルチキューを備えた Alibaba Cloud Linux 3 インスタンスでキュー数を調整します。
-
Linux インスタンスに接続します。
-
ip address showを使用してネットワーク設定を表示します:
-
プライマリ ENI eth0 が NIC マルチキューをサポートしているかどうかを確認します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を確認するには、識別子を eth1、eth2 などに置き換えます。
ethtool -l eth0 -
出力を確認します:
-
「事前設定の最大値」の「Combined」が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値が 最大キュー数です。
-
「現在のハードウェア設定」の「Combined」が、現在使用中のキュー数です。
この例では、ENI は最大 3 つの複合 (RX+TX) キューをサポートし、3 つが使用中です。

-
-
プライマリ ENI eth0 の使用するキュー数を 2 に設定します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を調整するには、識別子を eth1、eth2 などに置き換えます。
sudo ethtool -L eth0 combined NNは、ENI が使用するキューの数です。Nは、「事前設定の最大値」の「Combined」の値以下である必要があります。プライマリ ENI のキュー数を 2 に設定します:
sudo ethtool -L eth0 combined 2
IRQ アフィニティの設定
NIC マルチキューは通常、IRQ アフィニティの設定を必要とします。これにより、異なるキューからの割り込みを特定の CPU コアに割り当て、競合を減らし、パフォーマンスを向上させます。
-
Red Hat Enterprise Linux を除くすべてのパブリックイメージでは、IRQ アフィニティはデフォルトで有効になっています。
-
Red Hat Enterprise Linux は IRQ アフィニティをサポートしていますが、デフォルトでは有効になっていません。以下の手順に従って設定してください。
以下の手順では、ecs_mq スクリプトを使用して、Red Hat Enterprise Linux 9.2 イメージで IRQ アフィニティを設定します。他のイメージでは、IRQ アフィニティはデフォルトで有効になっています。
-
Linux インスタンスに接続します。
-
(オプション) irqbalance サービスを停止します。
irqbalance サービスは IRQ アフィニティを動的に調整するため、
ecs_mqと競合する可能性があります。最初にこのサービスを停止してください。systemctl stop irqbalance.service -
最新の
ecs_mqスクリプトをダウンロードします:wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/ecs_mq/ecs_mq_latest.tgz -
ecs_mqパッケージを解凍します:tar -xzf ecs_mq_latest.tgz -
作業ディレクトリに移動します:
cd ecs_mq/ -
ecs_mqインストールスクリプトを実行します:bash install.sh redhat 9説明redhatと9を、お使いのオペレーティングシステムの名前とメジャーバージョン番号に置き換えてください。 -
ecs_mqサービスを開始します:systemctl start ecs_mqこのサービスは自動的に IRQ アフィニティを有効にします。
スループットとレイテンシーを監視しながら、さまざまなキュー数と IRQ アフィニティの組み合わせをテストして、最適なバランスを見つけてください。