[アップデート]AWS EC2インスタンスでENAキューの柔軟な割り当てが可能になりました
こんにちは、コンサルティング部の南です。
EC2インスタンスでENA(Elastic Network Adapter)のキュー配分を柔軟に設定できるようになったというアップデートがありました。
これにより、ネットワーク集約的なアプリケーションにより多くのキューを配分し、CPU集約的なアプリケーションには少ないキューで動作させることが可能になります。
実際に試してみたので紹介します。
アップデート概要
今回のアップデートで、EC2インスタンスのElastic Network Interface(ENI)において、ENA queueの配分を動的に調整できるようになりました。
従来は、ENI毎に静的にENA queueが配分されており、柔軟性に欠けていました。
今回のアップデートにより、動的にqueueを配分できるようになり、ワークロードの要件に応じた最適なリソース分散が可能となりました。
ネットワーク帯域とPPS(Packets Per Second)について
多くのエンジニアの方はネットワーク帯域幅(Gbps)については意識されたことがあるかと思いますが、PPS(Packets Per Second:1秒あたりのパケット数) についてはあまり気にしたことがない方も多いのではないでしょうか。
PPSとは何か
PPSは文字通り1秒間に処理できるパケットの数を示す指標です。ネットワーク帯域と密接に関係していますが、パケットサイズによってPPSの上限は大きく変わります。
例えば10Gbpsのネットワーク帯域を持つインスタンスでも
- 大きなパケット(1500 bytes)の場合:約830K PPS
- 小さなパケット(64 bytes)の場合:約19.5M PPS
このようにパケットサイズが小さいほど、より多くのPPSが必要になります。
AWSにおけるPPSの扱い
AWS公式ではネットワーク帯域幅は公開していますが、PPSについては公開していません。これは以下のような複数の要因が絡み合ってPPSの上限が決まるためです
- パケットサイズ
- RX/TXキューの数
- インスタンスタイプとNitroカードの世代
そのため「実際に測定してみるしかない」というのが実情です。
CloudWatchメトリクスでPPS制限を確認する
ただし、PPS制限に達しているかどうかは確認できます。CloudWatchメトリクスの pps_allowance_exceeded
を監視することで、インスタンスがPPS上限を超えているかを判定できます。
マイクロバーストとネットワークパフォーマンス問題
ネットワーク帯域に余裕があるにも関わらず、PPSの上限を超えてしまうことでネットワークパフォーマンスが低下する問題が発生することがあります。
特に「マイクロバースト」と呼ばれる現象では
- 数秒〜ミリ秒の短時間でトラフィックが急増
- 平均的な使用率は低いのに一瞬だけPPS制限に引っかかる
- パケットのドロップが発生し、アプリケーションのパフォーマンスに影響
- TCPの再送が増加し、全体的な応答時間が悪化
これについては、AWS re:Postでも詳しく解説されています
これまでのPPS制限対応方法
以前はPPSの上限を上げるためには限られた選択肢しかありませんでした
- インスタンスサイズを大きくする
- ネットワーク最適化インスタンスを使用する
- 複数のENIを使用する
- 複数のネットワークインターフェースでトラフィックを分散
今回のアップデート
今回のアップデートによって今まで静的に設定されていた、RX/TXキューを動的に割り当てることが可能になりました。
AWS公式ドキュメントによると、ENA queueには以下のような特性があります
基本概念
ENA キューは、インスタンスのタイプとサイズに基づいて、デフォルトの静的制限付きでネットワークインターフェースに割り当てられます。サポートされているインスタンスタイプでは、これらのキューを Elastic Network Interface (ENI) 全体に動的に割り当てることができます。
柔軟な配分の利点
柔軟なENAキュー割り当てにより、以下のメリットが得られます
- リソース配分の最適化:ワークロードの特性に応じた最適なキュー配分
- vCPU使用率の最大化:各vCPUを効率的に活用
- ワークロード別チューニング:ネットワーク負荷vs CPU負荷に応じた調整
具体的には以下のようにワークロードに合わせてキューを配分することが可能になったわけです。
- ネットワーク負荷の高いアプリケーション:より多くのキューを配分
- CPU負荷の高いアプリケーション:より少ないキューで効率的に動作
対応インスタンスタイプと確認方法
サポートされているインスタンス
以下のインスタンスファミリーが複数のENA キューの動的な割り当てをサポートしています
- 汎用: M6i、M6id、M6idn、M6in
- コンピューティング最適化: C6i、C6id、C6in
- メモリ最適化: R6i、R6in
CLIでサポート状況を確認
# ENA queue動的割り当てをサポートするインスタンスタイプを確認
aws ec2 describe-instance-types \
--filters Name=network-info.flexible-ena-queues-support,Values=supported
注意: Amazon EC2 ベアメタルインスタンスはサポートされていません。
利用可能なキュー数の確認
# 利用可能なキューの詳細情報を取得
aws ec2 describe-instance-types \
--filters "Name=network-info.flexible-ena-queues-support,Values=supported" \
--query "InstanceTypes[*].[InstanceType,NetworkInfo.NetworkCards[*].DefaultEnaQueueCountPerInterface,NetworkInfo.NetworkCards[*].MaximumEnaQueueCount,NetworkInfo.NetworkCards[*].MaximumEnaQueueCountPerInterface]" \
--output json
出力例
[
[
"c6i.large",
[2],
[4],
[4]
],
[
"c6i.xlarge",
[2],
[8],
[8]
]
]
この出力から以下の情報が分かります
DefaultEnaQueueCountPerInterface
: ENIあたりのデフォルトキュー数MaximumEnaQueueCount
: インスタンス全体での最大キュー数MaximumEnaQueueCountPerInterface
: 単一ENIあたりの最大キュー数
2025年5月31日現在のENA queueの割り当ては以下のようになっています。
インスタンスタイプ | ENIあたりのデフォルトキュー数 | インスタンス全体での最大キュー数 | 単一ENIあたりの最大キュー数 |
---|---|---|---|
c6i.large | 2 | 6 | 2 |
c6i.xlarge | 4 | 16 | 4 |
c6i.2xlarge | 8 | 32 | 8 |
c6i.4xlarge | 8 | 64 | 16 |
c6i.8xlarge | 8 | 64 | 32 |
c6i.12xlarge | 8 | 64 | 32 |
c6i.16xlarge | 8 | 120 | 32 |
c6i.24xlarge | 8 | 120 | 32 |
c6i.32xlarge | 8 | 120 | 32 |
c6id.large | 2 | 6 | 2 |
c6id.xlarge | 4 | 16 | 4 |
c6id.2xlarge | 8 | 32 | 8 |
c6id.4xlarge | 8 | 64 | 16 |
c6id.8xlarge | 8 | 64 | 32 |
c6id.12xlarge | 8 | 64 | 32 |
c6id.16xlarge | 8 | 120 | 32 |
c6id.24xlarge | 8 | 120 | 32 |
c6id.32xlarge | 8 | 120 | 32 |
c6in.large | 2 | 6 | 2 |
c6in.xlarge | 4 | 16 | 4 |
c6in.2xlarge | 8 | 32 | 8 |
c6in.4xlarge | 8 | 64 | 16 |
c6in.8xlarge | 16 | 128 | 32 |
c6in.12xlarge | 16 | 128 | 32 |
c6in.16xlarge | 16 | 240 | 32 |
c6in.24xlarge | 32 | 480 | 32 |
c6in.32xlarge | 32 (x2) | 256 (x2) | 32 (x2) |
m6i.large | 2 | 6 | 2 |
m6i.xlarge | 4 | 16 | 4 |
m6i.2xlarge | 8 | 32 | 8 |
m6i.4xlarge | 8 | 64 | 16 |
m6i.8xlarge | 8 | 64 | 32 |
m6i.12xlarge | 8 | 64 | 32 |
m6i.16xlarge | 8 | 120 | 32 |
m6i.24xlarge | 8 | 120 | 32 |
m6i.32xlarge | 8 | 120 | 32 |
m6id.large | 2 | 6 | 2 |
m6id.xlarge | 4 | 16 | 4 |
m6id.2xlarge | 8 | 32 | 8 |
m6id.4xlarge | 8 | 64 | 16 |
m6id.8xlarge | 8 | 64 | 32 |
m6id.12xlarge | 8 | 64 | 32 |
m6id.16xlarge | 8 | 120 | 32 |
m6id.24xlarge | 8 | 120 | 32 |
m6id.32xlarge | 8 | 120 | 32 |
m6in.large | 2 | 6 | 2 |
m6in.xlarge | 4 | 16 | 4 |
m6in.2xlarge | 8 | 32 | 8 |
m6in.4xlarge | 8 | 64 | 16 |
m6in.8xlarge | 16 | 128 | 32 |
m6in.12xlarge | 16 | 128 | 32 |
m6in.16xlarge | 16 | 240 | 32 |
m6in.24xlarge | 32 | 480 | 32 |
m6in.32xlarge | 32 (x2) | 256 (x2) | 32 (x2) |
m6idn.large | 2 | 6 | 2 |
m6idn.xlarge | 4 | 16 | 4 |
m6idn.2xlarge | 8 | 32 | 8 |
m6idn.4xlarge | 8 | 64 | 16 |
m6idn.8xlarge | 16 | 128 | 32 |
m6idn.12xlarge | 16 | 128 | 32 |
m6idn.16xlarge | 16 | 240 | 32 |
m6idn.24xlarge | 32 | 480 | 32 |
m6idn.32xlarge | 32 (x2) | 256 (x2) | 32 (x2) |
r6i.large | 2 | 6 | 2 |
r6i.xlarge | 4 | 16 | 4 |
r6i.2xlarge | 8 | 32 | 8 |
r6i.4xlarge | 8 | 64 | 16 |
r6i.8xlarge | 8 | 64 | 32 |
r6i.12xlarge | 8 | 64 | 32 |
r6i.16xlarge | 8 | 120 | 32 |
r6i.24xlarge | 8 | 120 | 32 |
r6i.32xlarge | 8 | 120 | 32 |
r6id.large | 2 | 6 | 2 |
r6id.xlarge | 4 | 16 | 4 |
r6id.2xlarge | 8 | 32 | 8 |
r6id.4xlarge | 8 | 64 | 16 |
r6id.8xlarge | 8 | 64 | 32 |
r6id.12xlarge | 8 | 64 | 32 |
r6id.16xlarge | 8 | 120 | 32 |
r6id.24xlarge | 8 | 120 | 32 |
r6id.32xlarge | 8 | 120 | 32 |
r6in.large | 2 | 6 | 2 |
r6in.xlarge | 4 | 16 | 4 |
r6in.2xlarge | 8 | 32 | 8 |
r6in.4xlarge | 8 | 64 | 16 |
r6in.8xlarge | 16 | 128 | 32 |
r6in.12xlarge | 16 | 128 | 32 |
r6in.16xlarge | 16 | 240 | 32 |
r6in.24xlarge | 32 | 480 | 32 |
r6in.32xlarge | 32 (x2) | 256 (x2) | 32 (x2) |
r6idn.large | 2 | 6 | 2 |
r6idn.xlarge | 4 | 16 | 4 |
r6idn.2xlarge | 8 | 32 | 8 |
r6idn.4xlarge | 8 | 64 | 16 |
r6idn.8xlarge | 16 | 128 | 32 |
r6idn.12xlarge | 16 | 128 | 32 |
r6idn.16xlarge | 16 | 240 | 32 |
r6idn.24xlarge | 32 | 480 | 32 |
r6idn.32xlarge | 32 (x2) | 256 (x2) | 32 (x2) |
- (x2) は、そのインスタンスタイプが2つのネットワークカードを持っていることを示します
この表から、それぞれのインスタンスタイプで2xlargeまでのサイズについては、すでにデフォルトのキュー数がENI当たりの最大のキュー数で設定されていることが分かりますね。
4xlarge以降で必要に応じてキュー数を増やせるみたいです。
ただし、インスタンスファミリーやオプションによってENI当たりの最大のキュー数は変わらないみたいですね。
実際に設定してみる
制約事項
キューの数を変更する前に、以下の制約を理解しておく必要があります
- インスタンスの停止が必要: ENA キューの数を変更する前に、インスタンスを停止する必要があります
- 2の累乗の値: ENA キューの値は、1、2、4、8、16、32 などの 2 の累乗にする必要があります
- vCPU数制限: 単一の ENI に割り当てられるキューの数は、インスタンスで使用可能な vCPU の数を超えることはできません
マネジメントコンソールでの設定
インスタンス新規作成時の場合は「高度なネットワーク設定」にENA queuesという項目が追加されており、そこから設定することが出来ますね。
インスタンスタイプごとに最大値が書かれているので、親切設計ですね。
なお、2の累乗ではない場合はバリデーションで弾かれます。
既存のインスタンスの場合は、「ネットワーキング」の設定のManage ENA queuesから設定変更が可能です。
インスタンスを停止すると、以下のように指定することが出来ます。
AWS CLIでの設定
AWS CLIで設定する場合は以下の通りです。
1. attach-network-interface
新しいENIを attach する際にキュー数を指定
aws ec2 attach-network-interface \
--network-interface-id eni-001aa1bb223cdd4e4 \
--instance-id i-1234567890abcdef0 \
--device-index 1 \
--ena-queue-count 32
2. run-instances
インスタンス起動時に複数ENIのキュー設定を指定
aws ec2 run-instances \
--image-id ami-12ab3c30 \
--instance-type c6i.large \
--min-count 1 \
--max-count 1 \
--network-interfaces \
'[{"DeviceIndex":0,"SubnetId":"subnet-123456789012a345a","EnaQueueCount":2},
{"DeviceIndex":1,"SubnetId":"subnet-123456789012a345a","EnaQueueCount":2},
{"DeviceIndex":2,"SubnetId":"subnet-123456789012a345a","EnaQueueCount":2}]'
3. modify-network-interface-attribute
既存ENIのキュー数を変更
# キュー数を32に変更
aws ec2 modify-network-interface-attribute \
--network-interface-id eni-1234567890abcdef0 \
--attachment AttachmentId=eni-attach-12345678,EnaQueueCount=32
# デフォルト設定に戻す
aws ec2 modify-network-interface-attribute \
--network-interface-id eni-1234567890abcdef0 \
--attachment AttachmentId=eni-attach-12345678,DefaultEnaQueueCount=true
まとめ
今回のアップデートによってENA queueを動的に変更することが出来ました。
これまでPPS制限に悩まされていた方にとっては、注目度の高いアップデートなのではないでしょうか。
従来はPPS制限を改善するためにインスタンスサイズを大きくするか、複数ENIを使った複雑な構成を組む必要がありましたが、今回のアップデートによってより柔軟で効率的な対応が可能になりました。
現在はM6i、C6i、R6iファミリーのみの対応となっていますが、ネットワークパフォーマンスの課題を抱えている場合は、まずは対応インスタンスタイプでの検証を検討してみることをお勧めします。
設定変更後はpps_allowance_exceeded
メトリクスで効果をしっかりと測定し、アプリケーションの特性に応じた最適なキュー数を見つけることが重要ですね。