AnsibleとEC2経由でのベンチマーク実行
これは、負荷テストを実行するためにAmazon Web Services EC2インスタンス用のAnsibleを使用した自動セットアップで、kcb.shスクリプトの一般的なCLIを拡張します。
これは、負荷生成のための単一インスタンスでは不十分な場合、例えば、TIMED_WAIT
ステータスの接続が多すぎてネットワーク接続が十分に速く確立できない場合に使用します。また、ユーザーが観測するレイテンシを最小限に抑えたり、シミュレートしたりするために、同じまたは異なるAWSリージョンにロードドライバを配置するのにも役立ちます。
前提条件
-
テストのためのKeycloakの準備 からのKeycloak URL
-
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
です。
-
必要なAnsible AWSコレクションをインストールします。
./aws_ec2.sh requirements
-
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アドレスでホストインベントリファイルを再作成します。
ベンチマーク
フォルダ構成
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ログとリターンコードが含まれています。 |