ネットワークインターフェースコントローラー (NIC) マルチキュー機能を使用すると、NIC に複数の送信 (Tx) キューと受信 (Rx) キューを設定できます。各キューは異なる CPU コアで処理できます。NIC マルチキュー機能は、複数の CPU コアが NIC 上の異なるキュー内のネットワークパケットを同時に処理できるようにすることで、ネットワーク I/O スループットを向上させ、レイテンシを削減するように設計されています。
NIC マルチキュー機能のメリット
従来のシングルキュー NIC は、単一の CPU コアを使用してすべてのパケットを処理するため、CPU の過負荷、レイテンシの増加、パケット損失が発生しやすくなります。最新のサーバーには、マルチコア CPU が搭載されています。マルチキュー NIC は、ネットワークトラフィックを異なる CPU コアに分散できます。これにより、マルチコアコンピューティングリソースの利用率が向上します。
テスト結果によると、同じパケット転送速度とネットワーク帯域幅の条件下では、2 つのキューは 1 つのキューよりも 50% から 100% パフォーマンスが向上し、4 つのキューを使用するとパフォーマンスの向上はさらに大きくなります。NIC マルチキュー機能には、次のメリットがあります。
マルチコア CPU アーキテクチャの利用率を向上させる。マルチキュー NIC は、ネットワークトラフィックを複数の CPU コアに分散して処理できます。これにより、CPU コアの負荷分散を改善し、CPU 利用率を向上させることができます。
スループットの向上。マルチキュー NIC を使用すると、複数のパケットを同時に処理できるため、特に高負荷時にネットワークのスループットを大幅に向上させることができます。
レイテンシの削減。パケットを異なるキューに分散して処理できます。これにより、単一キューの輻輳が軽減され、レイテンシが短縮されます。
パケット損失の削減。高トラフィックのシナリオでは、NIC マルチキュー機能により、単一キューの過負荷によるパケット損失を減らすことができます。
ほとんどの場合、NIC マルチキュー機能は上記のメリットを提供します。ただし、機能の設定が不適切な場合、パフォーマンスの低下やその他の問題が発生する可能性があります。たとえば、NIC および CPU アフィニティでサポートされるキュー数の設定が不適切な場合、不要なコンテキスト切り替えオーバーヘッドが発生する可能性があります。NIC でサポートされるキュー数を小さい値に設定すると、ハードウェアリソースを最大限に活用できません。
ほとんどの場合、Elastic Network Interface (ENI) を Elastic Compute Service (ECS) インスタンスにバインドした後、ENI でサポートされるキュー数は、ENI あたりのインスタンスタイプでサポートされるデフォルトのキュー数に自動的に設定され、オペレーティングシステムで有効になります。ENI でサポートされるキュー数を手動で変更する場合は、ビジネスシナリオとハードウェア条件に基づいて ENI のマルチキューパラメーターを適切に設定する方法を検討してください。
NIC マルチキュー機能のコアメカニズム
キュー分割
ENI は複数のコンバインドキューをサポートしています。各コンバインドキューは、独立した CPU コアによって処理されます。このようにして、異なるキュー内のパケットを並列に処理できます。これにより、ロックの競合が軽減され、マルチコアのパフォーマンスが最大限に活用されます。
Rx キューと Tx キューは、ENI がパケットを処理するために使用する 2 つの異なるタイプのキューです。各コンバインドキューは、Rx キューと Tx キューで構成されます。
Rx キュー: ネットワークから受信したパケットを処理するために使用されます。パケットが ENI に到着すると、ポーリングやフローベースの分散など、特定のルールに基づいてパケットが異なる Rx キューに分散されます。
Tx キュー: 送信されるパケットを管理します。アプリケーションによって生成された出力リクエストは、最初に対応する Tx キューに配置され、次に順序や優先度などのさまざまな要因に基づいて ENI によって送信されます。
IRQ アフィニティのサポート
各キューは独立した割り込みに関連付けられています。割り込み要求 (IRQ) アフィニティは、単一の CPU コアの過負荷を防ぐために、異なるキューの割り込みを特定の CPU コアに分散するために使用されます。
デフォルトでは、Red Hat Enterprise Linux イメージを除き、追加の設定なしで、すべてのイメージで IRQ アフィニティが有効になっています。詳細については、このトピックのIRQ アフィニティの設定セクションをご参照ください。
制約と制限
NIC マルチキュー機能をサポートするインスタンスタイプについては、インスタンスファミリーの概要NIC キューをご参照ください。 列のインスタンスタイプの値が 1 より大きい場合、そのインスタンスタイプは NIC マルチキュー機能をサポートしています。
NIC マルチキュー機能をサポートするインスタンスタイプの場合、ENI をインスタンスにバインドした後、そのインスタンスタイプのインスタンスで機能が自動的に有効になります。
インスタンスタイプテーブルのインスタンスタイプの [NIC キュー] 列の値は、そのインスタンスタイプで ENI あたりに許可される最大キュー数を示しています。
DescribeInstanceTypesInstanceTypeFamily オペレーションを呼び出して、 パラメーターで指定されたインスタンスファミリーの NIC キュー数に関するメトリックをクエリできます。
ENI でサポートされるデフォルトのキュー数
プライマリ ENI キュー番号SecondaryEniQueueNumberレスポンスの パラメーターの値は、プライマリ ENI でサポートされるデフォルトのキュー数を示します。 パラメーターの値は、セカンダリ ENI でサポートされるデフォルトのキュー数を示します。
ENI でサポートされる最大キュー数
1つの ENI あたりの最大キュー数レスポンスの パラメーターの値は、指定されたインスタンスファミリーで ENI あたりに許可される最大キュー数を示します。
キュークォータ
TotalEniQueueQuantityレスポンスの パラメーターの値は、指定されたインスタンスファミリーのキュークォータを示します。
2.6 より前のカーネルバージョンを含む特定の初期バージョンのパブリックイメージは、NIC マルチキュー機能をサポートしていない場合があります。最新のパブリックイメージを使用することをお勧めします。
ENI でサポートされるキュー数を確認する
ECS コンソールで ENI でサポートされるキュー数を確認する
ECS コンソール - ENI に移動します。
上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。

管理するセカンダリ ENI の ID をクリックして、ENI 詳細ページに移動します。
基本情報セクションで、[キュー数] パラメーターの値を確認します。これは、ENI でサポートされているキューの数を示します。

ENI でサポートされるキュー数を変更した場合、新しいキュー数が表示されます。
ENI でサポートされるキュー数を変更したことがない場合は、次のいずれかの値が表示されます。
ENI が ECS インスタンスにバインドされていない場合は、空の値が表示されます。
ENI が ECS インスタンスにバインドされている場合は、ENI でサポートされるデフォルトのキュー数が表示されます。
API オペレーションを呼び出して ENI でサポートされるキュー数を確認する
DescribeNetworkInterfaceAttribute 操作を呼び出して、ENI のキュー関連パラメーターを照会し、応答の QueueNumber パラメーターの値を確認して、ENI でサポートされているキューの数を確認します。
ENI でサポートされるキュー数を変更した場合、新しいキュー数が表示されます。
ENI でサポートされるキュー数を変更したことがない場合は、次のいずれかの値が表示されます。
ENI が ECS インスタンスにバインドされていない場合は、空の値が表示されます。
ENI が ECS インスタンスにバインドされている場合は、ENI でサポートされるデフォルトのキュー数が表示されます。
関連付けられている ECS インスタンスに接続した後に、ENI でサポートされるキュー数を確認する
Linux ECS インスタンスに接続します。
説明ECS コンソールで、または API オペレーションを呼び出すことによって、Windows ECS インスタンスにバインドされている ENI でサポートされるキュー数を確認できます。
詳細については、Workbench を使用して SSH 経由で Linux インスタンスに接続するをご参照ください。
ip aコマンドを実行して、ネットワーク設定を表示します。
次のコマンドを実行して、プライマリ ENI eth0 で NIC マルチキュー機能が有効になっているかどうかを確認します。
この例では、プライマリ ENI が使用されています。セカンダリ ENI を使用する場合は、ENI 名を eth1 や eth2 などの実際の ENI 名に置き換えます。
ethtool -l eth0コマンド出力を表示して、NIC マルチキュー機能が有効になっているかどうかを確認します。
[Pre-set maximums] セクションの [Combined] フィールドの値が 1 より大きい場合、ENI はマルチキュー機能をサポートしています。[Pre-set maximums] セクションの [Combined] フィールドの値は、ENI でサポートされる最大キュー数を示します。
[Current hardware settings] セクションの [Combined] フィールドの値は、ENI で使用できるキュー数を示します。
この例では、コマンド出力は、ENI が最大 3 つのコンバインドキューをサポートし、3 つのコンバインドキューを使用していることを示しています。

ENI でサポートされる最大キュー数を変更する方法については、このトピックのENI でサポートされるキュー数を変更するセクションをご参照ください。
ENI で使用できるキュー数を変更する方法については、このトピックのオペレーティングシステムで ENI で使用できるキュー数を変更するセクションをご参照ください。
ENI でサポートされるキュー数を変更する
ほとんどの場合、ENI を ECS インスタンスにバインドした後、ENI でサポートされるキュー数は、インスタンスタイプの ENI でサポートされるデフォルトのキュー数に自動的に設定され、オペレーティングシステムで有効になります。ENI でサポートされるキュー数を手動で変更する場合は、ECS コンソールを使用するか、API オペレーションを呼び出すことができます。次の点に注意してください。
ENI が [使用可能] 状態の場合、または ENI が [使用中] 状態であり、ENI がバインドされている ECS インスタンスが [停止] 状態の場合にのみ、ENI でサポートされるキュー数を変更できます。
ECS インスタンスにバインドされている ENI でサポートされるキュー数は、インスタンスタイプで ENI あたりに許可される最大キュー数を超えることはできません。
ECS インスタンス上のすべての ENI のキューの合計数は、インスタンスタイプで許可されるキュークォータを超えることはできません。
ECS コンソールを使用する
上部のナビゲーションバーで、管理するリソースのリージョンとリソースグループを選択します。

管理するセカンダリ ENI の ID をクリックして、ENI 詳細ページに移動します。
ENI でサポートされるキュー数を変更します。

確認 をクリックします。
API オペレーションを呼び出す
ModifyNetworkInterfaceAttribute 操作を呼び出し、QueueNumber パラメーターに値を指定して、ENI でサポートされるキューの数を変更します。
ECS インスタンスにバインドされている ENI でサポートされるキュー数を変更した場合、インスタンスの起動後に新しいキュー数が有効になります。
オペレーティングシステムで ENI で使用できるキュー数を変更する
ECS コンソールで、または API オペレーションを呼び出すことによって、ENI でサポートされるキュー数を変更した後、変更はオペレーティングシステムで自動的に有効になります。
オペレーティングシステムで ENI で使用できるキュー数を、ENI でサポートされるキュー数よりも小さい数に変更できます。
オペレーティングシステムで ENI で使用できるキュー数を変更しても、ENI でサポートされるキュー数には影響しません。ENI で使用できるキュー数は、ECS コンソールには表示されず、API オペレーションのレスポンスでも返されません。
オペレーティングシステムで ENI で使用できるキュー数を変更した場合、インスタンスの再起動後、変更は有効になりません。
次の例では、Alibaba Cloud Linux 3 を実行する ECS インスタンスが使用されています。Alibaba Cloud Linux 3 は、NIC マルチキュー機能をサポートしています。
Linux ECS インスタンスに接続します。
詳細については、Workbench を使用して SSH 経由で Linux インスタンスに接続するをご参照ください。
ip address showコマンドを実行して、ネットワーク設定を表示します。
次のコマンドを実行して、プライマリ ENI eth0 で NIC マルチキュー機能が有効になっているかどうかを確認します。
この例では、プライマリ ENI が使用されています。セカンダリ ENI を使用する場合は、ENI 名を eth1 や eth2 などの実際の ENI 名に置き換えます。
ethtool -l eth0コマンド出力を表示して、NIC マルチキュー機能が有効になっているかどうかを確認します。
[Pre-set maximums] セクションの [Combined] フィールドの値が 1 より大きい場合、ENI はマルチキュー機能をサポートしています。[Pre-set maximums] セクションの [Combined] フィールドの値は、ENI でサポートされる最大キュー数を示します。
[Current hardware settings] セクションの [Combined] フィールドの値は、ENI で使用できるキュー数を示します。
この例では、コマンド出力は、ENI が最大 3 つのコンバインドキューをサポートし、3 つのコンバインドキューを使用していることを示しています。

次のコマンドを実行して、プライマリ ENI eth0 で使用できるキュー数を 2 に変更します。
この例では、プライマリ ENI が使用されています。セカンダリ ENI を使用する場合は、ENI 名を eth1 や eth2 などの実際の ENI 名に置き換えます。
sudo ethtool -L eth0 combined NNは、ENI で使用したいキュー数を指定します。Nは、[Pre-set maximums] セクションの [Combined] フィールドの値以下である必要があります。この例では、プライマリ ENI は 2 つのキューを使用するように設定されています。
sudo ethtool -L eth0 combined 2
IRQ アフィニティを設定する
NIC マルチキュー機能を使用する場合は、割り込みを任意の CPU に割り当てるのではなく、異なるキューの割り込みを特定の CPU に割り当てる IRQ アフィニティを設定する必要があります。これにより、CPU 間の競合が軽減され、ネットワークパフォーマンスが向上します。
デフォルトでは、Red Hat Enterprise Linux イメージを除き、追加の設定なしで、すべてのイメージで IRQ アフィニティが有効になっています。
IRQ アフィニティは Red Hat Enterprise Linux イメージでサポートされていますが、イメージではデフォルトで無効になっています。Red Hat Enterprise Linux イメージを使用するインスタンスの IRQ アフィニティを設定するには、このセクションで説明されている操作を実行します。
このセクションでは、ecs_mq スクリプトを使用して、Red Hat 9.2 イメージを使用する Linux ECS インスタンスの IRQ アフィニティを設定する方法について説明します。イメージが Red Hat Enterprise Linux イメージでない場合、IRQ アフィニティはデフォルトで有効になっています。IRQ アフィニティを設定する必要はありません。
Linux ECS インスタンスに接続します。
詳細については、Workbench を使用して SSH 経由で Linux インスタンスに接続するをご参照ください。
(オプション) irqbalance サービスを無効にします。
irqbalance サービスは、IRQ アフィニティ設定を動的に変更します。
ecs_mqスクリプトは irqbalance サービスと競合します。irqbalance サービスを無効にすることをお勧めします。systemctl stop irqbalance.service次のコマンドを実行して、
ecs_mqスクリプトの新しいバージョンを含むパッケージをダウンロードします。wget https://ecs-image-tools.oss-cn-hangzhou.aliyuncs.com/ecs_mq/ecs_mq_2.0.5.tgz次のコマンドを実行して、
ecs_mqスクリプトを抽出します。tar -xzf ecs_mq_2.0.5.tgz次のコマンドを実行して、作業パスを変更します。
cd ecs_mq/次のコマンドを実行して、
ecs_mqスクリプトを実行するために必要な環境をインストールします。bash install.sh redhat 9説明redhat と 9 を実際の
オペレーティングシステム名とオペレーティングシステムのメジャーバージョン番号に置き換えます。次のコマンドを実行して、
ecs_mqスクリプトを起動します。systemctl start ecs_mqスクリプトが起動されると、IRQ アフィニティが自動的に有効になります。
ENI のキュー数を変更したり、IRQ アフィニティを設定したり、上記の両方の操作を実行して、ネットワークパフォーマンスを最適化できます。負荷分散を確保するには、適切な数のキューを各 CPU コアに割り当て、スループットやレイテンシなど、システムの実際の負荷とパフォーマンスデータに基づいて IRQ アフィニティを設定します。システムパフォーマンスデータを取得するには、さまざまなキューと IRQ アフィニティ設定をテストできます。