NIC マルチキューを使用すると、ネットワークインターフェースで複数の送受信キューを構成できます。各キューは異なる CPU コアによって処理されます。その目的は、複数の CPU コアにわたってネットワークパケットを並列処理することで、ネットワーク I/O スループットを向上させ、レイテンシーを低減することです。
NIC マルチキューを使用する理由
従来のシングルキューネットワークインターフェースは、すべてのパケットを処理するために 1 つの CPU コアに依存しています。これにより、CPU 過負荷、レイテンシーの増加、およびパケット損失が発生する可能性があります。最新のサーバーにはマルチコア CPU が搭載されており、NIC マルチキューはこれらのコアにネットワークトラフィックを分散させ、より効率的なリソース利用率を実現します。
同じネットワーク PPS および帯域幅の条件下で、テストでは 1 つのキューの代わりに 2 つのキューを使用すると、ネットワークパフォーマンスが 50% から 100% 向上することが示されています。4 つのキューを使用すると、さらに大きなメリットが得られます。
-
マルチコア CPU アーキテクチャのより良い利用: ネットワークトラフィックを複数の CPU コアに分散させ、負荷のバランスをとり、CPU 使用率を向上させます。
-
スループットの向上: 複数のパケットを同時に処理することで、特に高負荷時にネットワークスループットが大幅に向上します。
-
レイテンシーの低減: 複数のキューにパケットを分散させることで、輻輳を軽減します。
-
パケット損失の低減: 高トラフィック時に過負荷状態のシングルキューによって引き起こされるパケット損失を軽減します。
NIC マルチキューはこれらのメリットを提供しますが、不適切な構成はパフォーマンスを低下させたり、他の問題を引き起こしたりする可能性があります。たとえば、キュー数や CPU アフィニティの設定が正しくないと、不要なコンテキストスイッチングのオーバーヘッドが発生する可能性があります。キュー数を低く設定しすぎると、ハードウェアリソースを十分に活用できない場合があります。
通常、Elastic Network Interface (ENI) がインスタンスにアタッチされると、そのキュー数はインスタンスタイプに応じたデフォルト値に自動的に設定され、この設定はオペレーティングシステム内で有効になります。ENI のキュー数を手動で調整する必要がある場合は、まず特定のユースケースとハードウェア条件を慎重に検討し、最適な構成を決定する必要があります。
NIC マルチキューの仕組み
-
キューアーキテクチャ
Elastic Network Interface (ENI) は複数の結合キューをサポートしています。各結合キューは独立した CPU コアによって処理され、並列パケット処理を可能にし、ロック競合を低減し、マルチコアパフォーマンスを最大限に活用します。
受信 (RX) および送信 (TX) キューは、パケット処理に使用される 2 種類のキューです。各結合キューは、1 つの RX キューと 1 つの TX キューで構成されます。
-
RX キュー: RX キューは、ネットワークからの受信データパケットを処理するために使用されます。パケットが到着すると、ネットワークインターフェースはラウンドロビンやフローベースのハッシュ化などの分散戦略に基づいて、特定の RX キューにパケットを分散します。
-
TX キュー: TX キューは、送信データパケットを管理するために使用されます。アプリケーションは生成されたパケットを TX キューに配置し、ネットワークインターフェースはシーケンスや優先度などの要因に基づいてそれらを送信します。
-
-
IRQ アフィニティのサポート
各キューは独立した割り込みに関連付けられています。IRQ アフィニティは、割り込み処理を異なる CPU コアに分散させ、単一のコアが過負荷になるのを防ぎます。
IRQ アフィニティは、Red Hat Enterprise Linux (RHEL) を除くすべてのパブリックイメージでデフォルトで有効になっています。詳細については、「IRQ アフィニティの構成」をご参照ください。
制限事項
-
一部のインスタンスタイプのみが NIC マルチキューをサポートしています。詳細については、「インスタンスタイプファミリー」をご参照ください。[NIC queues] 列の値が 1 より大きい場合、そのインスタンスタイプは NIC マルチキューをサポートしています。
-
NIC マルチキューをサポートするインスタンスタイプの場合、ENI をインスタンスにアタッチすると、この機能は自動的に有効になります。
-
インスタンスタイプにリストされているキュー数は、そのタイプがサポートするENI あたりの最大キュー数を表します。
-
DescribeInstanceTypes API オペレーションを呼び出し、InstanceTypeFamily パラメーターを指定することで、インスタンスタイプファミリーのキュー関連メトリクスをクエリできます。
-
デフォルトキュー数
PrimaryEniQueueNumber レスポンスパラメーターは、プライマリ ENI のデフォルトキュー数を示します。SecondaryEniQueueNumber パラメーターは、セカンダリ ENI のデフォルトキュー数を示します。
-
ENI あたりの最大キュー数
MaximumQueueNumberPerEni レスポンスパラメーターは、インスタンスタイプファミリーに許可される ENI あたりの最大キュー数を示します。
-
合計キュークォータ
TotalEniQueueQuantity レスポンスパラメーターは、インスタンスタイプファミリーに許可される合計キュークォータを示します。
-
-
-
カーネルバージョン 2.6 以前の一部の古いパブリックイメージは、NIC マルチキューをサポートしない場合があります。最新のパブリックイメージを使用することを推奨します。
ENI キュー数の確認
コンソール
ECS コンソール - Elastic Network Interfaces にアクセスします。
上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。
-
対象のセカンダリ ENI の ID をクリックして、その詳細ページに移動します。
-
「基本情報」セクションで、「キュー」パラメーターを見つけます。この値は、ENI の現在のキュー数を示します。

-
ENI のキュー数を変更した場合、変更された値が表示されます。
-
ENI のキュー数を変更していない場合:
-
ENI がインスタンスにアタッチされていない場合、値は表示されません。
-
ENI がインスタンスにアタッチされている場合、インスタンスタイプのデフォルトキュー数が表示されます。
-
-
API
DescribeNetworkInterfaceAttribute オペレーションを呼び出すことで、ENI のキュー数を確認できます。応答の QueueNumber パラメーターはキュー数を示します。
-
ENI のキュー数を変更した場合、変更された値が表示されます。
-
ENI のキュー数を変更していない場合:
-
ENI がインスタンスにアタッチされていない場合、値は表示されません。
-
ENI がインスタンスにアタッチされている場合、インスタンスタイプのデフォルトキュー数が表示されます。
-
インスタンス内
-
Linux インスタンスに接続します。
説明Windows インスタンスの場合、コンソールまたは API オペレーションを呼び出すことで ENI キュー数を確認できます。
詳細については、「ワークベンチを使用して Linux インスタンスにログインする」をご参照ください。
-
ip aコマンドを実行して、ネットワーク構成情報を確認します。
-
次のコマンドを実行して、プライマリ ENI eth0 が NIC マルチキューをサポートしているかどうかを確認します。
この例ではプライマリ ENI を使用しています。セカンダリ ENI を確認するには、ネットワークインターフェース識別子を eth1、eth2、または別の値に置き換えます。
ethtool -l eth0コマンド出力で NIC マルチキューがサポートされているかどうかを確認します。
-
[Pre-set maximums] の下の "Combined" の値が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値は、ENI がサポートする最大キュー数を示します。
-
[Current hardware settings] の下の "Combined" の値は、現在使用中のキュー数を示します。
この例では、出力は ENI が最大 3 つの結合 (RX+TX) キューをサポートし、現在 3 つのキューを使用していることを示しています。

-
ENI がサポートする最大キュー数を変更するには、「ENI のキュー数の変更」をご参照ください。
-
OS で使用されるキュー数を変更するには、「OS で使用されるキュー数の変更」をご参照ください。
-
ENI キュー数の変更
ENI のキュー数はインスタンスにアタッチされる際にデフォルト値に設定されますが、コンソールまたは API を使用して手動で調整できます。
-
ENI のキュー数は、そのステータスが [利用可能] の場合、または [使用中] であり、かつアタッチされているインスタンスが [停止済み] の場合にのみ変更できます。
-
キュー数は、インスタンスタイプごとの ENI あたりの最大キュー数を超えることはできません。
-
インスタンス上のすべての ENI の合計キュー数は、インスタンスタイプごとの合計キュークォータを超えることはできません。
コンソール
ECS コンソール - Elastic Network Interfaces にアクセスします。
上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。
-
対象のセカンダリ ENI の ID をクリックして、その詳細ページに移動します。
-
[Modify Queue Count] をクリックします。

-
[OK] をクリックして変更を完了します。
API
ModifyNetworkInterfaceAttribute オペレーションを呼び出し、QueueNumber パラメーターを設定することで、ENI のキュー数を変更できます。
インスタンスにアタッチされている ENI のキュー数を変更すると、インスタンスの起動後に新しい設定が有効になります。
OS キュー数の変更
コンソールまたは API を使用してENI のキュー数を変更すると、新しい設定は OS 内で自動的に有効になります。OS 内で ENI が使用するキュー数は、設定したキュー数と一致します。
ENI が OS 内でアクティブに使用するキュー数を調整することもできます。この値は、ENI に構成されているキュー数よりも少なくすることができます。
-
インスタンス内でOS が使用するキュー数を変更しても、ENI がサポートする最大キュー数には影響せず、この変更はコンソールや API の応答には表示されません。
-
この変更は一時的なものであり、インスタンスの再起動後も保持されません。
次の例は、NIC マルチキューをサポートする Alibaba Cloud Linux 3 インスタンスで ENI が使用するキュー数を調整する方法を示しています。
-
Linux インスタンスに接続します。
詳細については、「ワークベンチを使用して Linux インスタンスにログインする」をご参照ください。
-
ip address showコマンドを実行して、ネットワーク構成情報を確認します。
-
次のコマンドを実行して、プライマリ ENI eth0 が NIC マルチキューをサポートしているかどうかを確認します。
この例ではプライマリ ENI を使用しています。セカンダリ ENI を確認するには、ネットワークインターフェース識別子を eth1、eth2、または別の値に置き換えます。
ethtool -l eth0 -
コマンド出力で NIC マルチキューがサポートされているかどうかを確認します。
-
[Pre-set maximums] の下の "Combined" の値が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値は、ENI がサポートする最大キュー数を示します。
-
[Current hardware settings] の下の "Combined" の値は、現在使用中のキュー数を示します。
この例では、出力は ENI が最大 3 つの結合 (RX+TX) キューをサポートし、現在 3 つのキューを使用していることを示しています。

-
-
次のコマンドを実行して、プライマリ ENI eth0 のアクティブなキュー数を 2 に設定します。
この例ではプライマリ ENI を使用しています。セカンダリ ENI を調整するには、ネットワークインターフェース識別子を eth1、eth2、または別の値に置き換えます。
sudo ethtool -L eth0 combined NNは、ENI に使用させたいキュー数です。Nは、[Pre-set maximums] の下の "Combined" の値以下である必要があります。この例では、プライマリ ENI のキュー数を 2 に設定します。
sudo ethtool -L eth0 combined 2
IRQ アフィニティの構成
NIC マルチキューを使用する場合、通常は IRQ アフィニティを構成する必要があります。このプロセスは、異なるキューからの割り込みを特定の CPU コアに割り当て、任意のコアがそれらを処理するのを防ぎ、CPU 競合を低減し、ネットワークパフォーマンスを向上させるのに役立ちます。
-
Red Hat Enterprise Linux (RHEL) を除くすべてのパブリックイメージでは、IRQ アフィニティはデフォルトで有効になっており、追加の構成は不要です。
-
RHEL イメージは NIC マルチキューの IRQ アフィニティをサポートしていますが、デフォルトでは無効になっています。このトピックの手順に従って構成してください。
次の手順は、ecs_mq スクリプトを使用して、Red Hat Enterprise Linux 9.2 イメージ上の NIC マルチキューの IRQ アフィニティを自動的に構成する方法を示しています。ご利用のインスタンスが RHEL イメージを使用していない場合、IRQ アフィニティはデフォルトで有効になっており、構成は不要です。
-
Linux インスタンスに接続します。
詳細については、「ワークベンチを使用して Linux インスタンスにログインする」をご参照ください。
-
(オプション) irqbalance サービスを停止します。
irqbalance サービスは IRQ アフィニティを動的に調整するため、
ecs_mqスクリプトと競合します。irqbalance サービスを停止することを推奨します。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 アフィニティが有効になります。
NIC キュー数の変更と IRQ アフィニティの構成は、ネットワークパフォーマンスを最適化するための異なる方法です。ご利用のシステムの実際の負荷に基づいて、異なる構成の組み合わせをテストする必要があります。スループットやレイテンシーなどのパフォーマンスメトリクスを監視します。このデータを使用して、キューを異なる CPU コアに割り当て、IRQ アフィニティを設定し、最適な負荷分散を実現します。