AnsibleとEC2経由でのベンチマーク実行

これは、負荷テストを実行するためにAmazon Web Services EC2インスタンス用のAnsibleを使用した自動セットアップで、kcb.shスクリプトの一般的なCLIを拡張します。

これは、負荷生成のための単一インスタンスでは不十分な場合、例えば、TIMED_WAITステータスの接続が多すぎてネットワーク接続が十分に速く確立できない場合に使用します。また、ユーザーが観測するレイテンシを最小限に抑えたり、シミュレートしたりするために、同じまたは異なるAWSリージョンにロードドライバを配置するのにも役立ちます。

前提条件

  1. テストのためのKeycloakの準備 からのKeycloak URL

  2. AWS CLIのインストール

  3. Ansible CLIのインストール(Fedoraでは dnf install ansible を使用)

負荷生成のためのEC2インスタンス

フォルダ構成

ansible フォルダには、次のファイルとフォルダがあります。

roles/aws_ec2

Ansibleロール。

roles/aws_ec2/defaults/main.yml

Ansibleロールのデフォルト。ラッパースクリプトで読み込まれる env.yml で上書き可能です。

aws_ec2.sh

ラッパースクリプト。

設定

環境を設定するための設定ファイル env.yml を作成します。設定例として env_example.yaml ファイルをご利用ください。

env.yml を介してEC2環境を設定する設定例
cluster_size: 5
instance_type: t4g.small
instance_volume_size: 30

env.yml でカスタマイズする最も重要なパラメータは次のとおりです。

cluster_size

作成されるインスタンスの数。デフォルトでは、Gatlingは新しいユーザーごとに新しいHTTP接続を作成します。ロードドライバのネットワークスタックがTIME_WAIT状態の多数の接続で輻輳する可能性があるため、秒間250ユーザーあたりEC2インスタンス1つを目安にしてください。

instance_type

作成されるインスタンスのサイズ。「AWSインスタンスタイプ」をご参照ください。

EC2インスタンスの作成

インスタンスは、作成元のシステムのIPアドレスに紐づけられます!

インスタンスを作成する際、マシンを作成するホストのパブリックIPアドレスがEC2セキュリティグループに追加され、このIPアドレスのみがSSH経由でロードドライバにログインすることを許可されます。パブリックIPアドレスが変更された場合は、create コマンドを再実行する必要があります。パブリックIPアドレスは、例えば、場所やネットワークを変更した場合、または自宅のインターネット接続が毎晩IPアドレスを更新した場合などに変更されます。Ansibleを実行しているホストのIPアドレスが接続できない場合に表示されるメッセージは Failed to connect to the host via ssh です。

  1. 必要なAnsible AWSコレクションをインストールします。

    ./aws_ec2.sh requirements
  2. EC2インスタンスと関連インフラストラクチャを作成します。完了までに約5分かかります。

    ./aws_ec2.sh create <REGION>

    これにより、ホストにアクセスするためのAnsibleホストインベントリファイルと一致するSSHプライベートキーが作成されます。

    • benchmark_<USERNAME>_<REGION>_inventory.yml

    • benchmark_<USERNAME>_<REGION>.pem

EC2インスタンスの停止/開始

作成後、EC2インスタンスは実行中です。コストを節約するために、停止して、必要なときに後で開始することを検討してください。これは、インスタンスを再度作成するよりも少し時間がかかりません。

./aws_ec2.sh stop <REGION>
./aws_ec2.sh start <REGION>

start アクションは、再起動されたホストの新しいIPアドレスでホストインベントリファイルを再作成します。

EC2インスタンスのデバッグ

EC2インスタンスの問題を分析するには、インストール手順で作成したキーを使用して ssh でインスタンスのシェルを開いてください。EC2インスタンスのIPアドレスについては、インベントリファイルを参照してください。

ssh ec2-user@<ip> -i benchmark_<user>_<region>.pem

不要になったら、リージョン内のすべてのEC2ロードジェネレータノードを削除します。

./aws_ec2.sh delete <REGION>

これにより、インスタンスと関連リソース、およびローカルインベントリファイルとプライベートキーが削除されます。

ベンチマーク

フォルダ構成

roles/benchmark

Ansibleロール。

roles/benchmark/defaults/main.yml

Ansibleロールのデフォルト。ラッパースクリプトで読み込まれる env.yml で上書き可能です。

benchmark.sh

ラッパースクリプト。

設定

環境を設定するために、設定ファイル env.yml を更新します。設定例として env_example.yaml ファイルをご利用ください。

env.yml を介してベンチマーク実行を設定する設定例
kcb_zip: ../benchmark/target/keycloak-benchmark-999.0.0-SNAPSHOT.zip
kcb_heap_size: 1G

ベンチマークのインストールと実行

最初のパラメータとしてリージョンを指定し、次に kcb.sh スクリプトに適用されるパラメータを指定します。詳細については、CLIからのベンチマーク実行 のページをご参照ください。

プレイブックは、出力構造を生成し、負荷を分散するためにいくつかのパラメータを解析するため、パラメータ scenario が必須です。パラメータ concurrent-users が指定されている場合、負荷が分散されるEC2ノードの倍数である必要があります。

パラメータ concurrent-users または users-per-sec を使用して、Keycloakインスタンスに対して実行される合計負荷を指定します。プレイブックは、コマンドラインで指定された concurrent-users または users-per-sec を読み取り、EC2インスタンスで実行されている各 kcb.sh スクリプトに値を渡す前に、これらの数値をEC2インスタンスの数で割ります。

./benchmark.sh <REGION> <P1> <P2> ... <Pn>

コマンド例は以下のようになります。

./benchmark.sh eu-west-1 --scenario=keycloak.scenario.authentication.ClientSecret \
    --server-url=https://keycloak-runner-keycloak.apps.....openshiftapps.com \
    --users-per-sec=1000 \
    --measurement=600 \
    --realm-name=realm-0 \
    --clients-per-realm=10000

これは、benchmark_<USERNAME>_<REGION>_inventory.yml にリストされているホストにKeycloakベンチマークをインストールし、パラメータ P1、P2、… Pn を kcb.sh スクリプトに渡してベンチマークを実行します。

その他のパラメータは env.yml ファイルから設定可能です。

インストールするベンチマークのバージョンは kcb_version パラメータで指定できます。

ファイルがローカルに存在する場合は kcb_zip パラメータを、ダウンロード元を指定する場合は kcb_zip_url パラメータを直接指定することも可能です。kcb_version はファイル名から抽出されます。

パラメータ skip_install を使用してインストール手順をスキップできます。その場合、変数 kcb_version は、以前にインストールされたものに基づいて指定する必要があります。

ベンチマーク結果

分散シミュレーションの集計レポートは、実行ディレクトリからの相対パスにある files フォルダにローカル保存されます。

📒 files/
└─📂  benchmark/
   └─📂 keycloak-benchmark-{{ kcb_version }}/
     └─📂 results/
       └─📂 {{ scenario }}-{{ timestamp }}/
         ├─📂 simulation/ (1)
         │ ├─📄 {{ host_1 }}.log
         │ ├─📄 {{ host_2 }}.log
         │ └─📄 ...
         ├─📂 gatling/ (2)
         │ ├─📄 {{ host_1 }}.log
         │ ├─📄 {{ host_2 }}.log
         │ ├─📄 ...
         │ ├─📄 {{ host_1 }}.rc
         │ ├─📄 {{ host_2 }}.rc
         │ └─📄 ...
         └─📄 index.html
1 simulation/ ディレクトリには、個々のノードからのシミュレーションデータが含まれています。
2 gatling/ ディレクトリには、個々のノードからのGatlingログとリターンコードが含まれています。