Linux ベースの EC2 インスタンスのネットワークレイテンシーを改善する
ネットワークレイテンシーとは、データのパケットが送信元から送信先に移動するまでにかかる時間です。ネットワークを介してデータを送信するアプリケーションは、快適なユーザーエクスペリエンスを提供するためにタイムリーな応答が不可欠です。ネットワークレイテンシーが長くなると、次のようなさまざまな問題が発生する可能性があります。
-
ウェブページのロードが遅い
-
ビデオストリーミングのタイムラグ
-
オンラインリソースへのアクセスが難しい
このセクションでは、Linux で実行される Amazon EC2 インスタンスのネットワークレイテンシーを改善するために実行できる手順の概要を説明します。最適なレイテンシーを実現するには、以下の手順に従ってインスタンス、カーネル、および ENA ドライバーの設定を行います。その他の設定ガイダンスについては、GitHub の「ENA Linux ドライバーのベストプラクティスとパフォーマンス最適化ガイド
注記
手順と設定は、特定のネットワークハードウェア、インスタンスを起動した AMI、およびアプリケーションのユースケースによって若干異なる場合があります。変更を加える前に、ネットワークパフォーマンスを徹底的にテストおよびモニタリングして、望ましい結果が得られることを確認してください。
データパケットのネットワークホップの数を減らす
データパケットがルーター間を移動する(ホップする)たびにネットワークレイテンシーが増加します。通常、トラフィックが送信先に到達するには、複数のホップを経由する必要があります。Amazon EC2 インスタンスのネットワークホップを減らすには、次の 2 つの方法があります。
-
クラスタープレイスメントグループ – クラスタープレイスメントグループを指定すると、Amazon EC2 は、同じアベイラビリティーゾーン (AZ) 内の物理的に互いに近いインスタンスをよりタイトなパッキングで起動します。グループ内のインスタンスが物理的に近接していることにより、高速接続を利用できるため、レイテンシーは低く、単一フローのスループットは高くなります。
-
専有ホスト – 専有ホストはお客様専用の物理サーバーです。専有ホストを使用すると、インスタンスを起動して同じ物理サーバー上で実行できます。同じ専有ホストで実行されるインスタンス間では、余分なネットワークホップなしで通信できます。
Linux カーネルの設定がレイテンシーに与える影響
Linux カーネル設定では、ネットワークレイテンシーを増減できます。レイテンシー最適化の目標を達成するには、ワークロードの特定の要件に応じて Linux カーネル設定を微調整することが重要です。
Linux カーネルには、ネットワークレイテンシーを減らすのに役立つ設定オプションが多数あります。最も影響の大きいオプションは次のとおりです。
-
ビジーポーリングモードを有効にする – ビジーポーリングモードを使用すると、ネットワーク受信パスのレーテンシーが減少します。ビジーポーリングモードを有効にすると、ソケットレイヤーコードはネットワークデバイスの受信キューを直接ポーリングできます。ビジーポーリングの欠点は、タイトなループで新しいデータをポーリングすることにより、ホストの CPU 使用率が高くなることです。すべてのインターフェイスでパケットを待機するマイクロ秒数を制御するグローバル設定は 2 つあります。
busy_read
-
ソケット読み込み時の低レイテンシーのビジーポーリングタイムアウト。これにより、ソケット層がデバイスキューのパケットを読み取るまでのマイクロ秒数を制御します。sysctl コマンドを使用して機能をグローバルに有効にするには、Linux カーネル組織は 50 マイクロ秒の値を推奨しています。詳細については、「Linux カーネルユーザーおよび管理者ガイド」の「busy_read
」を参照してください。 $
C:\>
sudo sysctl -w net.core.busy_read=
50
busy_poll
-
ポーリングとセレクティングの低レイテンシーのビジーポーリングタイムアウト。これにより、イベント待ち時間のマイクロ秒数を制御します。推奨値は 50~100 マイクロ秒で、ポーリングするソケットの数によって異なります。追加するソケットが多いほど、数値は大きい必要があります。
$
C:\>
sudo sysctl -w net.core.busy_poll=
50
-
CPU 電源状態の設定 (C ステート) – C ステートは非アクティブ時のコアのスリープレベルを制御します。C ステートを制御して、システムのレイテンシーとパフォーマンスを調整することができます。より深い C ステートでは、CPU は基本的に「スリープ」状態になり、起動してアクティブ状態に戻るまでリクエストに応答できません。コアをスリープ状態にするには時間がかかります。また、スリープ状態のコアによって、別のコアが高い周波数で動作するための余裕が生まれますが、そのスリープ状態にあるコアが再び稼働し処理を実行するのにも時間がかかります。
例えば、ネットワークパケットの中断を処理するように割り当てられたコアがスリープ状態である場合、その中断の処理に遅延が生じる可能性があります。より深い C ステートを使用しないようにシステムを設定できます。ただし、この設定では、プロセッサの反応レイテンシーは短縮されますが、他のコアの Turbo Boost 用のヘッドルームも減少します。
プロセッサーの反応レイテンシーを短縮するために、C ステートが深くなるのを制限できます。詳細については、「Amazon Linux 2 ユーザーガイド」の「深い C ステートの制限による高パフォーマンスと低レイテンシー」を参照してください。
ENA ネットワークドライバー設定
ENA ネットワークドライバーを使用すると、インスタンスとネットワーク間の通信が可能になります。ドライバーはネットワークパケットを処理し、ネットワークスタックまたは Nitro Card に渡します。ネットワークパケットが受信されると、Nitro Card は割り込みを生成して CPU がソフトウェアにイベントを通知します。
- 割り込み
-
割り込みは、デバイスまたはアプリケーションがプロセッサに送信する信号です。割り込みは、イベントが発生したこと、または即時の注意を要する条件が満たされたことをプロセッサに通知します。割り込みにより、ネットワークインターフェイスからのデータ受信、ハードウェアイベントの処理、他のデバイスからのリクエストの処理など、時間的制約のあるタスクを処理できます。
- 割り込みモデレーション
-
割り込みモデレーションは、割り込みを集約または遅延させることにより、デバイスが生成する割り込みの数を減らす手法です。割り込みモデレーションの目的は、多数の割り込みの処理に伴うオーバーヘッドを削減することによってシステムパフォーマンスを向上させることです。割り込みが多すぎると CPU 使用率が高くなり、スループットに悪影響を及ぼします。一方、割り込みが少なすぎると、レイテンシーが長くなります。
- 動的割り込みモデレーション
-
動的割り込みモデレーションは、現在のシステム負荷とトラフィックパターンに基づいて割り込みレートを動的に調整する、割り込みモデレーションの拡張形です。割り込みオーバーヘッドの削減と、1 秒あたりのパケット数 (つまり帯域幅) とのバランスをとることを目的としています。
注記
動的割り込みモデレーションは、一部の AMI ではデフォルトで有効になっています (ただし、すべての AMI で有効または無効にできます)。
ネットワークレイテンシーを最小限に抑えるために、割り込みモデレーションを無効にする必要があることがあります。ただし、これによって割り込み処理のオーバーヘッドが増加する可能性もあります。レイテンシーの低減とオーバーヘッドの最小化とのバランス点を見つけることが重要です。ethtool
コマンドは割り込みモデレーションの設定に役立ちます。デフォルトでは、rx-usecs
は 20
に設定され、tx-usecs
は 64
に設定されています。
現在の割り込み変更設定を取得するには、次のコマンドを使用します。
$
C:\>
ethtool -c
interface
| egrep "rx-usecs:|tx-usecs:|Adaptive RX"Adaptive RX: on TX: off rx-usecs: 20 tx-usecs: 64
割り込み変更および動的割り込みモデレーションを無効にするには、次のコマンドを使用します。
$
C:\>
sudo ethtool -C
interface
adaptive-rx off rx-usecs 0 tx-usecs 0