パケット処理を複数の CPU コアに分散させることで、ネットワークのスループットを向上させ、レイテンシーを削減します。
NIC マルチキューを使用する理由
単一キューのネットワークインターフェイスは、すべてのパケットを 1 つの CPU コアで処理するため、CPU の過負荷、レイテンシー、パケットロスを引き起こす可能性があります。NIC マルチキューは、トラフィックを複数のコアに分散させることで、リソースの利用率を向上させます。
同じ PPS と帯域幅の条件下では、2 つのキューを使用すると、単一キューに比べてネットワークパフォーマンスが 50% から 100% 向上します。4 つのキューを使用すると、さらに大きな効果が得られます:
-
マルチコアの利用率向上:トラフィックを CPU コア間に分散させることで、負荷を均等にし、利用率を高めます。
-
スループットの向上:パケット処理を並列化することで、特に高負荷時のスループットを向上させます。
-
レイテンシーの削減:パケットを複数のキューに分散させることで、輻輳とレイテンシーを削減します。
-
パケットロスの削減:高トラフィック時に単一キューが過負荷になることによるパケットロスを防ぎます。
不適切な設定はパフォーマンスを低下させる可能性があります。たとえば、不正確なキュー数や CPU アフィニティの設定は不要なコンテキストスイッチを引き起こし、キューが少なすぎるとハードウェアリソースを十分に活用できません。
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 インスタンスの場合、ENI のキュー数は ECS コンソールで表示するか、API を呼び出して確認できます。
-
ip aを使用してネットワーク設定を表示します:[root@ixxxxx ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:1b:74:12 brd ff:ff:ff:ff:ff:ff altname enp0s5 altname ens5 inet 172.16.20.226/24 brd 172.16.20.255 scope global dynamic noprefixroute eth0 valid_lft 315359814sec preferred_lft 315359814sec inet6 fe80::216:3eff:fe1b:7412/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:46:ff:fc brd ff:ff:ff:ff:ff:ff altname enp0s6 altname ens6 inet 172.16.20.227/24 brd 172.16.20.255 scope global dynamic noprefixroute eth1 valid_lft 315359814sec preferred_lft 315359814sec inet6 fe80::216:3eff:fe46:fffc/64 scope link valid_lft forever preferred_lft forever 4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8500 qdisc mq state UP group default qlen 1000 link/ether 00:16:3e:47:47:c2 brd ff:ff:ff:ff:ff:ff altname enp0s8 altname ens8 inet 172.16.20.228/24 brd 172.16.20.255 scope global dynamic noprefixroute eth2 valid_lft 315359814sec preferred_lft 315359814sec inet6 fe80::216:3eff:fe47:47c2/64 scope link valid_lft forever preferred_lft forever -
プライマリ ENI の eth0 が NIC マルチキューをサポートしているか確認します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を確認するには、識別子を eth1、eth2、または別の値に置き換えます。
ethtool -l eth0出力を確認します:
-
「Pre-set maximums」 の下の 「Combined」 が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値が 最大キュー数 です。
-
「Current hardware settings」 の下の 「Combined」 が、現在使用中のキュー数 です。
この例では、ENI は最大 3 つの結合 (RX+TX) キューをサポートし、現在 3 つを使用しています。
[root@xxx ~]# ethtool -l eth0 Channel parameters for eth0: Pre-set maximums: RX: n/a TX: n/a Other: n/a Combined: 3 Current hardware settings: RX: n/a TX: n/a Other: n/a Combined: 3-
最大キュー数を変更するには、「ENI のキュー数の変更」をご参照ください。
-
OS が使用するキュー数を変更するには、「OS が使用するキュー数の変更」をご参照ください。
-
ENI のキュー数の変更
ENI をインスタンスにアタッチすると、そのキュー数はインスタンスタイプのデフォルト設定になります。コンソールまたは API を呼び出すことで調整できます。次の点にご注意ください:
-
キュー数を変更できるのは、ENI が 関連付け待ち な場合、またはインスタンスが 停止済み の状態で バインド済み な場合に限られます。
-
キュー数は、インスタンスタイプの ENI あたりの最大キュー数を超えることはできません。
-
インスタンス上のすべての ENI の合計キュー数は、インスタンスタイプの合計キュークォータを超えることはできません。
コンソールの使用
ECS コンソール - ENI に移動します。
上部メニューで、対象リソースのリージョンとリソースグループを選択します。
-
対象のセカンダリ ENI ID をクリックして、詳細ページを開きます。
-
[キュー数を変更] をクリックします。
[NIC キュー番号] フィールドの横にある編集アイコンをクリックし、入力ボックスにターゲットキュー番号を入力します (有効範囲: 1~2048)。
-
[OK] をクリックします。
API の使用
ModifyNetworkInterfaceAttribute API を呼び出し、[QueueNumber] パラメーターを設定してキュー数を変更します。
新しいキュー数は、アタッチされているインスタンスの次回の起動時に有効になります。
OS が使用するキュー数の変更
ENI キュー数を変更すると、OS は自動的に新しい設定を適用します。
ENI が 実際に使用する キューの数を調整することもできます。この値は、設定されたキュー数以下である必要があります。
-
OS が使用するキュー数 を変更しても、ENI に設定されたキュー数には影響せず、コンソールや API の応答にも表示されません。
-
この変更は一時的なものであり、インスタンスを再起動すると元に戻ります。
次の例では、NIC マルチキューを備えた Alibaba Cloud Linux 3 インスタンスでキュー数を調整します。
-
Linux インスタンスに接続します。
-
ip address showを使用してネットワーク設定を表示します:[ecs-user@iZbpxxx ~]$ ip address show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:16:3e:37:7a:82 brd ff:ff:ff:ff:ff:ff altname enp0s5 altname ens5 inet 172.16.0.20/24 brd 172.16.0.255 scope global dynamic noprefixroute eth0 valid_lft 315359878sec preferred_lft 315359878sec inet6 fe80::216:3eff:fe37:7a82/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:16:3e:28:b1:9e brd ff:ff:ff:ff:ff:ff altname enp0s6 altname ens6 inet 172.16.0.21/24 brd 172.16.0.255 scope global dynamic noprefixroute eth1 valid_lft 315359879sec preferred_lft 315359879sec inet6 fe80::216:3eff:fe28:b19e/64 scope link valid_lft forever preferred_lft forever -
プライマリ ENI の eth0 が NIC マルチキューをサポートしているか確認します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を確認するには、識別子を eth1、eth2、または別の値に置き換えます。
ethtool -l eth0 -
出力を確認します:
-
「Pre-set maximums」 の下の 「Combined」 が 1 より大きい場合、ENI は NIC マルチキューをサポートしています。この値が 最大キュー数 です。
-
「Current hardware settings」 の下の 「Combined」 が、現在使用中のキュー数 です。
この例では、ENI は最大 3 つの結合 (RX+TX) キューをサポートし、3 つが使用中です。
[root@xxx ~]# ethtool -l eth0 Channel parameters for eth0: Pre-set maximums: RX: n/a TX: n/a Other: n/a Combined: 3 Current hardware settings: RX: n/a TX: n/a Other: n/a Combined: 3 -
-
プライマリ ENI eth0 のアクティブなキューの数を 2 に設定します。
この例ではプライマリ ENI を使用します。セカンダリ ENI を調整するには、識別子を eth1、eth2、または別の値に置き換えます。
sudo ethtool -L eth0 combined NNは、ENI が使用するキューの数です。Nは、「事前設定された最大値」の「合計」の値以下である必要があります。プライマリ ENI のキュー数を 2 に設定します:
sudo ethtool -L eth0 combined 2
IRQ アフィニティの設定
NIC マルチキューは通常、異なるキューからの割り込みを特定の CPU コアに割り当てるための IRQ アフィニティ設定を必要とします。これにより、競合が減り、パフォーマンスが向上します。
-
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 アフィニティの組み合わせをテストし、スループットとレイテンシーを監視して、最適なバランスを見つけてください。