ROSA上のKeycloakベンチマーク 主要な結果

これは、2024年5月に実施されたKeycloak 25リリース候補ビルドでのベンチマーク実行をまとめたものです。Keycloak環境の要件を計算するための出発点として使用してください。また、ご自身の環境で負荷テストを実行するために使用してください。

トークンをリフレッシュする際のCPU使用率の収集は現在手動で行われており、近い将来自動化される予定です(keycloak/keycloak-benchmark#517)。

セットアップ

このセットアップは、GitHub Actionsのスケジュールで毎日実行されています。

  • OpenShift 4.15.x が、AWSリージョン内の2つのAWSアベイラビリティゾーンを使用してROSA経由でAWSにデプロイされています。

  • c7g.2xlarge インスタンスを持つMachinepool。

  • Keycloak 25 リリース候補ビルドが、Operatorと各サイトに3つのポッドを持つアクティブ/パッシブ構成としてデプロイされ、Infinispanが2つのサイトを接続しています。

  • デフォルトのユーザーパスワードハッシュは、Argon2と5回のハッシュ反復、および最小メモリサイズ7 MiB (OWASP推奨)を使用しています。

  • データベースには、100,000ユーザーと100,000クライアントがシードされています。

  • Infinispanキャッシュはデフォルトで10,000エントリであるため、すべてのクライアントとユーザーがキャッシュに収まるわけではなく、一部のリクエストはデータベースからデータをフェッチする必要があります。

  • すべてのセッションはデフォルトで分散キャッシュに保存され、エントリごとに2つのオーナーを持つため、1つのポッドが失敗してもデータは失われません。

  • データベースはAmazon Aurora PostgreSQLで、マルチAZ構成で、ライターインスタンスはプライマリサイトのアベイラビリティゾーンにあります。

インストール

ROSA および OpenShift に記載されているようにOpenShiftとROSAをデプロイします。

OpenShift .env ファイル
# no KC_CPU_LIMITS set for this scenario
KC_CPU_REQUESTS=6
KC_INSTANCES=3
KC_DISABLE_STICKY_SESSION=true
KC_MEMORY_REQUESTS_MB=3000
KC_MEMORY_LIMITS_MB=4000
KC_DB_POOL_INITIAL_SIZE=30
KC_DB_POOL_MAX_SIZE=30
KC_DB_POOL_MIN_SIZE=30

結果

最新リリースの結果、計算例、考察、推奨事項については、Keycloakのメインドキュメントのconcepts-memory-and-cpu-sizingを参照してください。今後のリリースに関する最新情報は、GitHubリポジトリのmainブランチで入手できます。

実施されたテスト

各テストは10分間実行されました。

  1. ROSAクラスターをデフォルトとしてセットアップします。

  2. Keycloakとモニタリングをデプロイします。

    cd provision/openshift
    task
    task monitoring
  3. データセットを作成します。

    task dataset-import -- -a create-realms -u 100000
    # wait for first task to complete
    task dataset-import -- -a create-clients -c 100000 -n realm-0
  4. Ansible経由でベンチマークを実行するための環境を準備します。

    詳細については、AnsibleとEC2経由でのベンチマークの実行を参照してください。

    ここで使用する env.yml の内容
    cluster_size: 5
    instance_type: t4g.small
    instance_volume_size: 30
    kcb_zip: ../benchmark/target/keycloak-benchmark-999.0.0-SNAPSHOT.zip
    kcb_heap_size: 1G
  5. ロードランナーを作成します。

    cd ../../ansible
    ./aws_ec2.sh start <region of ROSA cluster>
  6. さまざまな負荷テストを実行します。

    • セッション作成のためのメモリのテスト

      ./benchmark.sh eu-west-1 \
      --scenario=keycloak.scenario.authentication.AuthorizationCode \
      --server-url=${KEYCLOAK_URL} \
      --realm-name=realm-0 \
      --users-per-sec=<number of users per second> \
      --ramp-up=20 \
      --logout-percentage=0 \
      --measurement=600 \
      --users-per-realm=100000 \
      --log-http-on-failure
    • ユーザーログインのCPU使用率のテスト

      ./benchmark.sh eu-west-1 \
      --scenario=keycloak.scenario.authentication.AuthorizationCode \
      --server-url=${KEYCLOAK_URL} \
      --realm-name=realm-0 \
      --users-per-sec=<number of users per second> \
      --ramp-up=20 \
      --logout-percentage=100 \
      --measurement=600 \
      --users-per-realm=100000 \
      --log-http-on-failure
    • ログイン1回あたり10回のリフレッシュの割合で、ログインとトークンのリフレッシュのCPU使用率をテストします。トークンリフレッシュのCPU使用率を取得するには、前のテストを使用してログインのみのCPU使用率を差し引いてください。

      ./benchmark.sh eu-west-1 \
      --scenario=keycloak.scenario.authentication.AuthorizationCode \
      --server-url=${KEYCLOAK_URL} \
      --realm-name=realm-0 \
      --users-per-sec=<number of users per second> \
      --ramp-up=20 \
      --logout-percentage=100 \
      --refresh-token-count=10 \
      --measurement=600 \
      --users-per-realm=100000 \
      --log-http-on-failure
    • クライアントクレデンシャルフローのCPU使用率のテスト

      ./benchmark.sh eu-west-1 \
      --scenario=keycloak.scenario.authentication.ClientSecret \
      --server-url=${KEYCLOAK_URL} \
      --realm-name=realm-0 \
      --users-per-sec=<number of clients per second> \
      --ramp-up=20 \
      --logout-percentage=100 \
      --measurement=600 \
      --users-per-realm=100000 \
      --log-http-on-failure