ROSA 上 Keycloak 基准测试关键结果

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

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

设置

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

  • 使用 m5.2xlarge 实例的机器池。

  • 使用 Operator 和 3 个 Pod 部署在每个站点上作为主动/被动设置的 Keycloak 25 发布候选版本构建,以及连接两个站点的 Infinispan。

  • 默认用户密码散列使用 Argon2 和 5 次散列迭代以及最小内存大小 7 MiB 如 OWASP 建议

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

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

  • 所有会话都位于分布式缓存中,如默认设置,每个条目有两个所有者,允许一个 Pod 出现故障而不会丢失数据。

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

安装

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-0.14-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:1。使用之前的测试来扣除仅登录的 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