Amazon Web Services ブログ

新機能 – ENA Express: EC2 でのネットワークレイテンシーとフローごとのパフォーマンスが向上

AWS では、可能であればいつでも、ネットワーク帯域幅とネットワークパフォーマンスの全体を、お客様が最大限に活用するということを理解しており、その環境を提供するために最善を尽くしています。年月を経るうちに、このネットワーク帯域幅は、当初の m1 インスタンスにおける 250 Mbps から、最新の m6in インスタンスでの 200 Gbps にまで増加してきました。また、本来の帯域幅に加えて、拡張ネットワーキングElastic Network Adapter (ENA)、および (密結合された HPC ワークロード向けとして) Elastic Fabric Adapter (EFA) などの高度なネットワーク機能も導入されてきました。

ENA Express のご紹介
今回、当社では ENA Express をリリースいたします。ENA Express は、これまでも Elastic Fabric Adapters を機能させてきた、Scalable Reliable Datagram (SRD) プロトコルをベースに構築されています。この ENA Express は、トラフィックフローの P99 レイテンシーを最大 50%、P99.9 レイテンシーでは (TCP と比較して) 最大85%削減すると同時に、シングルフローの最大帯域幅を 5 Gbps から 25 Gbps に増加させます。つまり、フローあたりの帯域幅が大幅に増加するとともに、その変動幅が大幅に減少します。

新規および既存の ENA で ENA Express を有効にするだけで、同じアベイラビリティーゾーンで実行されている c6gn インスタンス間の TCP および UDP トラフィックに対して、このパフォーマンスを活用できるようになります。

ENA Express の使用
ここでは、ENA Express のセットアップとテストを行うために、c6gn インスタンスを 1 ペア使用しました。これらのインスタンスを起動した後、AWS マネジメントコンソールを使用して、両方のインスタンスに対し ENA Express を有効化します。それぞれの ENI を見つけて選択し、[Actions] (アクション) メニューから [Manage ENA Express] (ENA Express を管理) を選択します。

[ENA Express][ENA Express UDP] を有効にし、[Save] (保存) を選択します。

次に、両方のインスタンスで最大伝送単位 (MTU) を 8900 に設定します。

$ sudo /sbin/ifconfig eth0 mtu 8900

両方のインスタンスに iperf3 をインストールし、最初のインスタンスをサーバーモードで起動します。

$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

次に、2 つ目のインスタンスをクライアントモードで実行し、結果を確認します。

$ iperf3 -c 10.0.178.46
Connecting to host 10.0.178.46, port 5201
[  4] local 10.0.187.74 port 35622 connected to 10.0.178.46 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  2.80 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   1.00-2.00   sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   2.00-3.00   sec  2.80 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   3.00-4.00   sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   4.00-5.00   sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   5.00-6.00   sec  2.80 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   6.00-7.00   sec  2.80 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   7.00-8.00   sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   8.00-9.00   sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
[  4]   9.00-10.00  sec  2.81 GBytes  24.1 Gbits/sec    0   1.43 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  28.0 GBytes  24.1 Gbits/sec    0             sender
[  4]   0.00-10.00  sec  28.0 GBytes  24.1 Gbits/sec                  receiver

ENA ドライバーが出力するメトリクスに関するレポートで、SRD が使用されていることを確認します。

ethtool -S eth0 | grep ena_srd
     ena_srd_mode: 3
     ena_srd_tx_pkts: 25858313
     ena_srd_eligible_tx_pkts: 25858323
     ena_srd_rx_pkts: 2831267
     ena_srd_resource_utilization: 0

ここでのメトリクスには、以下の意味があります。

  • ena_srd_mode は、SRD が TCP と UDP に対して有効なことを示します。
  • ena_srd_tx_pkts は、SRD 経由で送信されたパケットの数を示します。
  • ena_srd_eligible_pkts は、SRD 経由での送信の対象であったパケットの数を示します。接続の両端で ENA-SRD が有効になっていて、それらの接続が同じアベイラビリティーゾーンにあり、さらにパケットが UDP または TCP を使用している場合、そのパケットは SRD の対象です。
  • ena_srd_rx_pkts は、SRD 経由で受信されたパケットの数を示します。
  • ena_srd_resource_utilization は、割り当てられた Nitro ネットワークカードリソースの使用率を示します。この値は、開いている SRD 接続の数に比例します。この値が常に 100% 付近を示す場合は、より多くのインスタンスにスケールアウトするか、より大きなインスタンスサイズにスケールアップすることが適しています。

関連知識
ENA Express とSRDに関しては、知っておいていただきたいことが数点あります。

アクセス – 今回は、マネジメントコンソールコンソールを使用して ENA Express を有効化しテストを行いましたが、CLI、API、CloudFormation、CDK での利用もサポートされています。

フォールバック – TCP または UDP パケットが SRD 経由の送信に対応していない場合は、通常の方法で送信されます。

UDP – SRD は、複数のネットワークパスを利用して、それらにパケットを振り分けます。これは通常、パケットが順番通り到着することを、ある程度想定しているアプリケーションにとっては負荷となります。しかし、ENA Express の場合は、配信前の UDP パケットの順番が自動的に復旧されるので、アプリケーション側の負担をなくしています。UDP 上に独自の信頼性レイヤーを構築している場合、またはアプリケーションがパケットに対し順番どおりの到着を要求していない場合は、ENA Express に対し UDP ではなく TCP を有効にします。

インスタンスタイプとサイズ – 今回のリリースでは、16xlarge サイズの c6gn インスタンスをサポートしていますが、追加のインスタンスファミリーとサイズについても準備中です。

リソース使用率 – 前出の項で触れたように、ENA Express では、パケットの処理に Nitro Card のリソースを使用しています。この処理方式により、処理されるパケットごとに数マイクロ秒のレイテンシーが発生します。また、特定のインスタンスにおいて、1 秒間に処理できる最大パケット数に、さほど大きくはありませんがが測定可能な影響も与えています。小さなパケットサイズを高いパケットレートで処理するようなケースには、ENA Express が適していない場合があります。このケース以外であれば、SRD を有効にするだけで、フローあたりの広い帯域幅と、一貫性のあるレイテンシーを活用していただけます。

料金 – ENA Express の利用には追加料金はかかりません。

リージョン – ENA Express は、すべての商用 AWS リージョンで利用が可能です。

SRD のすべて
SRD に関するブログ記事を丸ごと書くことも考えましたが、今回は、同僚の忠告を受け入れることにしました。 SRD の詳細を学ぶのに役立つ優れたリソースを、以下にいくつか紹介します。

A Cloud-Optimized Transport for Elastic and Scalable HPC (伸縮自在でスケーラブルな HPC 向けのクラウド最適化トランスポート) – このホワイトペーパーでは、TCP ベースのネットワークで HPC トラフィックを処理する際に生じる課題を概説し、ばらつき (レイテンシーの外れ値) がスケーリングの効率に大きな影響を与える可能性があることを説明した上で、SRD の概要を簡潔にまとめています。

Scalable Reliable Datagram (SRD) は、非常に大規模なデータセンター向けに最適化されたプロトコルです。複数のパスにわたる負荷分散と、パケット損失やリンク障害からの迅速なリカバリに対応しています。SRDでは、一般的なイーサネットスイッチの標準 ECMP 機能を利用しながら、送信者がパケットのカプセル化を操作して使用するパスの選択を制御するという、ECMP の制限事項を回避しています。

このドキュメントには、全体的に興味深い詳細事項が多く記載されているので、一読の価値はあるでしょう。

In the Search for Performance, There’s More Than One Way to Build a Network (パフォーマンスの追求に複数存在するネットワークの構築方法) – この2021年のブログ記事では、Elastic Fabric Adapter を開発するという当社の決定を振り返ると同時に、パケット損失がアプリケーション全体のパフォーマンスに与える影響を示す、いくつかの重要なデータ (および役に立つグラフィック) を掲載しています。SRD の興味深い点の1つは、可能な帯域幅の全体を活用するため、およびパケット損失が発生した場合には迅速な復旧を行うために、送信側と受信側の間で複数のネットワークパスの可用性とパフォーマンスを追跡しながら、パケットを最大 64 のパスに分散していることです。

Jeff;

原文はこちらです。