CPU とメモリリソースのサイジングに関する概念

リソースの枯渇と輻輳を避けるために、これらの概念を理解してください

これを本番環境のサイジングの出発点として使用してください。負荷テストに基づいて、必要に応じて環境に合わせて値を調整してください。

パフォーマンスに関する推奨事項

  • より多くの Pod にスケールする場合(追加のオーバーヘッドのため)、およびクロスデータセンター構成を使用する場合(追加のトラフィックと操作のため)、パフォーマンスは低下します。

  • キャッシュサイズを大きくすると、Keycloak インスタンスが長時間実行されている場合のパフォーマンスが向上する可能性があります。これにより、応答時間が短縮され、データベースの IOPS が削減されます。ただし、インスタンスが再起動されるとこれらのキャッシュを埋める必要があるため、キャッシュが埋められた後に測定された安定状態に基づいてリソースを過度にタイトに設定しないでください。

  • これらの値を出発点として使用し、本番環境に移行する前に独自の負荷テストを実行してください。

概要

  • 使用される CPU は、以下のテスト済み制限までリクエスト数に比例して線形にスケールします。

推奨事項

  • Realm データと 10,000 のキャッシュされたセッションのキャッシュを含む Pod の基本メモリ使用量は、1250 MB の RAM です。

  • コンテナでは、Keycloak はヒープベースのメモリにメモリ制限の 70% を割り当てます。また、約 300 MB の非ヒープベースのメモリも使用します。要求されるメモリを計算するには、上記の計算を使用してください。メモリ制限として、上記の値から非ヒープメモリを差し引き、結果を 0.7 で割ってください。

  • パスワードベースのユーザーログインが毎秒 15 件の場合ごとに、クラスターに 1 vCPU を割り当てます(毎秒最大 300 件でテスト済み)。

    Keycloak は、ユーザーが提供したパスワードのハッシュ化に CPU 時間のほとんどを費やしており、ハッシュ反復回数に比例します。

  • クライアントクレデンシャルフロー認可が毎秒 120 件の場合ごとに、クラスターに 1 vCPU を割り当てます(毎秒最大 2000 件でテスト済み)。*

    ほとんどの CPU 時間は、新しい TLS 接続の作成に費やされます。これは、各クライアントが単一のリクエストのみを実行するためです。

  • リフレッシュトークンリクエストが毎秒 120 件の場合ごとに、クラスターに 1 vCPU を割り当てます(毎秒最大 435 件のリフレッシュトークンリクエストでテスト済み)。*

  • 負荷の急増に対応するために、CPU 使用率に 150% の追加ヘッドルームを残してください。これにより、ノードの高速な起動と、フェイルオーバータスクを処理するのに十分な容量が確保されます。Keycloak の Pod がテストでスロットリングされた場合、パフォーマンスは大幅に低下しました。

  • 2500 を超える異なるクライアントで同時にリクエストを実行する場合、標準のキャッシュサイズがそれぞれ 10000 エントリである場合、すべてのクライアント情報が Keycloak のキャッシュに収まらないことがあります。このため、クライアントデータがデータベースから頻繁に再ロードされるため、データベースがボトルネックになる可能性があります。データベースの使用量を減らすには、users キャッシュサイズを同時使用クライアント数の 2 倍に、realms キャッシュサイズを同時使用クライアント数の 4 倍に増やしてください。

デフォルトでユーザーセッションをデータベースに保存する Keycloak は、Aurora PostgreSQL マルチ AZ データベースで最適なパフォーマンスを得るために、次のリソースを必要とします。

毎秒 100 件のログイン/ログアウト/リフレッシュリクエストごと

  • 1400 Write IOPS を予算に計上してください。

  • 0.35 から 0.7 vCPU の間を割り当てます。

vCPU 要件は範囲として示されています。データベースホストの CPU 使用率が飽和状態になると、リクエストあたりの CPU 使用率は低下しますが、応答時間は増加します。データベースの CPU 割り当て量が少ないと、ピーク負荷時の応答時間が遅くなる可能性があります。ピーク負荷時の高速な応答時間が重要な場合は、より大きな CPU 割り当て量を選択してください。例については下記を参照してください。

実行中の Keycloak インスタンスのアクティビティの測定

Keycloak インスタンスのサイジングは、前のセクションで説明したパスワードベースのユーザーログイン、リフレッシュトークンリクエスト、およびクライアントクレデンシャルフロー認可の実際および予測される数に依存します。

これらの 3 つの主要な入力に対する実行中の Keycloak インスタンスの実際の数を取得するには、Keycloak が提供するメトリクスを使用します。

  • イベントタイプ login のユーザーイベントメトリクス keycloak_user_events_total には、パスワードベースのログインと Cookie ベースのログインの両方が含まれていますが、このサイジングガイドの最初の概算入力として役立ちます。

  • Keycloak によって実行されたパスワード検証の数を確認するには、メトリクス keycloak_credentials_password_hashing_validations_total を使用します。このメトリクスには、使用されたハッシュアルゴリズムと検証の結果に関する詳細を提供するタグも含まれています。利用可能なタグのリストは次のとおりです。realmalgorithmhashing_strengthoutcome

  • リフレッシュトークンリクエストとクライアントクレデンシャルフロー認可には、イベントタイプ refresh_token および client_login のユーザーイベントメトリクス keycloak_user_events_total をそれぞれ使用します。

詳細については、イベントメトリクスを使用したユーザーアクティビティの監視 および HTTP メトリクス ガイドを参照してください。

これらのメトリクスは、ユーザーアクティビティ負荷の日次および週次の変動を追跡し、システムのサイズ変更の必要性を示す可能性のある新たな傾向を特定し、サイジング計算を検証するために重要です。これらのユーザーイベントメトリクスを体系的に測定および評価することにより、システムがユーザーの行動と需要の変化に適切にスケールされ、応答性を維持できるようにすることができます。

計算例(シングルサイト)

目標サイズ

  • 毎秒 45 件のログインとログアウト

  • 毎秒 360 件のクライアントクレデンシャルフロー認可*

  • 毎秒 360 件のリフレッシュトークンリクエスト(ログインの 1:8 の比率)*

  • 3 Pod

計算された制限

  • Pod あたりのリクエスト CPU:3 vCPU

    (毎秒 45 件のログイン = 3 vCPU、毎秒 360 件のクライアントクレデンシャルフロー認可 = 3 vCPU、360 件のリフレッシュトークン = 3 vCPU。合計で 9 vCPU になります。クラスターで実行されている 3 つの Pod で、各 Pod は 3 vCPU をリクエストします。)

  • Pod あたりの CPU 制限:7.5 vCPU

    (ピーク、起動、およびフェイルオーバータスクを処理するために、追加の 150% のリクエスト CPU を許可します。)

  • Pod あたりのリクエストメモリ:1250 MB

    (1250 MB の基本メモリ)

  • Pod あたりのメモリ制限:1360 MB

    (1250 MB の予想メモリ使用量から 300 の非ヒープ使用量を差し引き、0.7 で割った値)

  • Aurora データベースインスタンス:ピーク負荷時の必要な応答時間に応じて、db.t4g.large または db.t4g.xlarge のいずれか。

    (毎秒 45 件のログイン、毎秒 5 件のログアウト、毎秒 360 件のリフレッシュトークン。合計で毎秒 410 件のリクエストになります。この予想される DB 使用量は 1.4 から 2.8 vCPU で、DB アイドル負荷は 0.3 vCPU です。これは、2 vCPU db.t4g.large インスタンスまたは 4 vCPU db.t4g.xlarge インスタンスのいずれかを示します。応答時間がピーク使用時に高くなっても許容できる場合は、2 vCPU db.t4g.large の方が費用対効果が高くなります。このシナリオで 2 vCPU db.t4g.large インスタンスの CPU 使用率が 90% に達すると、ログインとトークンリフレッシュの中央応答時間が最大 120 ミリ秒増加しました。ピーク使用時の応答時間を短縮するには、このシナリオでは 4 vCPU db.t4g.xlarge インスタンスを検討してください。)

マルチサイト構成のサイジング

1 つの AWS リージョン内の 2 つの AZ を使用したアクティブ/アクティブ Keycloak 構成のサイジングを作成するには、次の手順に従います。

  • 2 番目のサイトで上記と同じメモリサイジングで同じ数の Pod を作成します。

  • データベースのサイジングは変更されません。両方のサイトが同じデータベースライターインスタンスに接続します。

CPU リクエストと制限のサイジングに関しては、予想されるフェイルオーバーの動作に応じて異なるアプローチがあります。

高速フェイルオーバーとより高価

2 番目のサイトの CPU リクエストと制限を上記と同じに保ちます。これにより、残りのサイトはスケールする必要なく、プライマリサイトからのトラフィックをすぐに引き継ぐことができます。

低速フェイルオーバーとより費用対効果が高い

2 番目のサイトの CPU リクエストと制限を上記より 50% 削減します。いずれかのサイトで障害が発生した場合は、残りのサイトを 3 Pod から 6 Pod に手動、自動、または水平 Pod オートスケーラーを使用してスケールします。これには、クラスターまたはクラスターの自動スケーリング機能に十分な予備容量が必要です。

一部の環境向けの代替構成

2 番目のサイトの CPU リクエストを 50% 削減しますが、CPU 制限は上記と同じに保ちます。これにより、残りのサイトはトラフィックを引き継ぐことができますが、ノードが CPU 負荷を経験し、ピークトラフィック時の応答時間が遅くなるという欠点があります。この構成の利点は、フェイルオーバー時に Pod の数をスケールする必要がないため、セットアップが簡単になることです。

参照アーキテクチャ

さまざまなシナリオで約 10 分間のテストを実行するために上記の設定を取得するために、次の構成が使用されました。

  • ROSA 経由で AWS にデプロイされた OpenShift 4.17.x。

  • c7g.2xlarge インスタンスを備えたマシンプール。*

  • Operator でデプロイされ、アクティブ/アクティブモードの 2 つのサイトを備えた高可用性構成で 3 つの Pod を持つ Keycloak。

  • OpenShift のリバースプロキシは、クライアントの TLS 接続が Pod で終端されるパススルーモードで実行されます。

  • マルチ AZ 構成のデータベース Amazon Aurora PostgreSQL。

  • Argon2 と 5 回のハッシュ反復および最小メモリサイズ 7 MiB を使用したデフォルトのユーザーパスワードハッシュ化(OWASP が推奨するように)(これがデフォルトです)。

  • クライアントクレデンシャルフロー認可はリフレッシュトークンを使用しません(これがデフォルトです)。

  • 20,000 ユーザーと 20,000 クライアントでシードされたデータベース。

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

  • すべての認証セッションは、デフォルトとして分散キャッシュに保存され、エントリごとに 2 人のオーナーがおり、データを失うことなく 1 つの Pod を障害にすることができます。

  • すべてのユーザーおよびクライアントセッションはデータベースに保存され、マルチサイト構成でテストされたため、インメモリでキャッシュされません。固定数のユーザーおよびクライアントセッションがキャッシュされるため、シングルサイト構成ではわずかに高いパフォーマンスが期待できます。

  • OpenJDK 21

* AWS の非 ARM CPU アーキテクチャ(c7i/c7ac7g)の場合、クライアントクレデンシャルフロー認可とリフレッシュトークンのワークロードは CPU コアあたり最大 2 倍の操作数を配信できましたが、パスワードハッシュ化は CPU コアあたり一定の操作数を配信していました。ワークロードとクラウドの料金体系に応じて、独自のテストを実行し、混合ワークロードの独自の計算を行って、どちらのアーキテクチャがより良い料金体系を提供するかを確認してください。

このページの内容