Application Load Balancer (ALB) は、高い弾力性と大規模なレイヤー 7 トラフィック処理能力を提供します。ご利用の環境で ALB のパフォーマンスをベンチマークする必要がある場合は、このトピックで説明する方法をご利用ください。
テストトポロジー
次のアーキテクチャに基づいてテスト環境を設計します。
ストレステストの方法
主要メトリック
ALB には 4 つの主要メトリックがあります。各メトリックには異なるテストアプローチが必要です。
新規接続
ALB とバックエンドサーバーが新しい接続を処理する能力をテストするには、ショートコネクションを使用します。
テストにはシンプルなハートビートサービスを使用して、帯域幅を過剰に消費することによる影響を最小限に抑えてください。短時間接続でテストする場合は、クライアントポート枯渇の問題に注意してください。
同時接続
ALBとバックエンドサーバーが同時接続を処理する能力を検証するために、長接続を使用します。
各長時間接続をシンプルなハートビートサービスで維持します。長時間接続を使用して高い同時実行性をテストする場合は、クライアントポートの枯渇にも注意してください。
データスループット
帯域幅制限や特定のワークロード パターンをテストするには、[長時間接続] を使用します。
ストレステストツールには、5 秒などの短いタイムアウトを設定します。タイムアウトを長く設定すると、結果の平均応答時間が長くなり、目標負荷に達したかどうかを判断することが難しくなります。短いタイムアウトを設定すると、成功率における問題が反映されるため、負荷レベルを特定しやすくなります。
秒間リクエスト数
ALB とバックエンドサーバーのリクエスト処理能力をテストします。次のいずれかの接続タイプでテストできます。
HTTP 短時間接続
HTTP 長時間接続
HTTPS 短時間接続
HTTPS ロング接続
サーバーグループの設定
ストレステスト中はヘルスチェックを無効にして、バックエンドサーバーに送信されるリクエストの数を減らします。
ストレステストツール
ストレステストツールとして Apache ab を使用しないでください:
高い同時実行性下で、Apache ab は 3 秒、6 秒、9 秒の階段状の一時停止を示します。
Apache ab はコンテンツ長を使用してリクエストが成功したかどうかを判断します。ALB が複数のバックエンドサーバーにトラフィックを分散する場合、各サーバーが異なるコンテンツ長を返す可能性があり、不正確なテスト結果の原因となります。
ストレステストのパフォーマンスが低い原因
ストレステストで期待よりも低いパフォーマンスが示された場合は、次の一般的な原因を確認してください。
クライアントポートの枯渇
ストレステスト中、クライアントポートが枯渇すると接続障害が発生します。デフォルトでは、ALB は TCP の timestamp 属性を削除するため、Linux プロトコルスタックで tw_reuse (TIME_WAIT 接続の再利用) が機能しなくなります。その結果、TIME_WAIT 状態の接続が蓄積され、利用可能なクライアントポートが枯渇します。
解決策: 次のいずれかのアプローチを使用します。
短時間接続を長時間接続に置き換えます。
SO_LINGERソケットオプションを設定して、RST パケットを使用して接続を閉じます。
バックエンドサーバーの accept キューが満杯
バックエンドサーバーの accept キューが満杯になると、サーバーは SYN_ACK パケットを送信できなくなります。これにより、クライアント側でタイムアウトが発生します。
解決策: net.core.somaxconn のデフォルト値は 128 です。次のコマンドを実行して値を増やし、バックエンドサーバーでアプリケーションを再起動します:
sysctl -w net.core.somaxconn=1024
アプリケーションの依存関係のボトルネック
リクエストが ALB を通過してバックエンドサーバーに到達した後、サーバーの負荷は正常に見える場合があります。ただし、バックエンドサーバー上のアプリケーションがデータベースなどの他のサービスに依存している場合、その依存サービスがボトルネックとなり、全体のパフォーマンスが低下する可能性があります。
解決策: バックエンドサーバーから不要なアプリケーションを特定して削除するか、依存サービスをスケールアウトします。
異常なバックエンドサーバー
ストレステスト中、バックエンドサーバーのヘルスチェックステータスが不安定だと、パフォーマンスが低下する可能性があります。バックエンドサーバーのヘルスチェックが正常と異常の状態を繰り返し切り替わる (フラッピング) 場合、ALB は頻繁にサーバーを負荷分散ローテーションに追加したり削除したりします。
解決策: ストレステスト中はヘルスチェックを無効にして、バックエンドサーバーに送信されるヘルスチェックリクエストの数を減らします。