Keycloak on ROSA 基准测试关键结果

这总结了 2024 年 5 月使用 Keycloak 25 候选发布版本执行的基准测试运行。以此作为起点来计算 Keycloak 环境的需求。使用它们在您的环境中执行负载测试。

目前,刷新令牌的 CPU 使用率收集是手动执行的,预计在不久的将来实现自动化 (keycloak/keycloak-benchmark#517)。

设置

  • OpenShift 4.15.x 部署在 AWS 上,通过 ROSA,在 AWS 同一区域的两个 AWS 可用区中。

  • Machinepool 具有 c7g.2xlarge 实例。

  • Keycloak 25 候选发布版本,通过 Operator 部署,并在每个站点中以 active/passive 设置部署 3 个 Pod,以及连接两个站点的 Infinispan。

  • 默认用户密码哈希,使用 Argon2 和 5 次哈希迭代,最小内存大小为 7 MiB 根据 OWASP 推荐

  • 数据库已使用 100,000 个用户和 100,000 个客户端进行种子填充。

  • Infinispan 缓存默认为 10,000 个条目,因此并非所有客户端和用户都适合缓存,某些请求将需要从数据库中获取数据。

  • 所有会话都在分布式缓存中,按照默认设置,每个条目有两个所有者,允许一个 Pod 发生故障而不会丢失数据。

  • 数据库 Amazon Aurora PostgreSQL 在多可用区设置中,写入器实例位于主站点的可用区中。

安装

按照 ROSAOpenShift 中的描述部署 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 存储库的主分支

执行的测试

每个测试运行 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
    • 测试登录和刷新令牌的 CPU 使用率,比例为每次登录 10 次刷新。使用之前的测试推导出仅登录的 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