通过 Ansible 和 EC2 运行基准测试

这通过使用 Ansible 为 Amazon Web Services EC2 实例进行自动化设置,扩展了 kcb.sh 脚本的通用 CLI,以运行负载测试。

当单个实例不足以生成负载时,例如,由于状态为 TIMED_WAIT 的连接过多,网络连接无法足够快地建立时,请使用此方法。它还可以帮助您在相同或不同的 AWS 区域中拥有负载驱动程序,以最大程度地减少延迟或模拟用户观察到的延迟。

先决条件

  1. 来自 准备 Keycloak 以进行测试 的 Keycloak URL

  2. 安装 AWS CLI

  3. 安装 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 实例。

instance_type

要创建的实例大小,请参阅 AWS 实例类型

创建 EC2 实例

实例将绑定到创建它们的系统的 IP 地址!

创建实例时,创建机器的主机的公共 IP 地址将添加到 EC2 安全组,并且仅允许此 IP 地址通过 SSH 登录到负载驱动程序。当公共 IP 地址更改时,您需要重新运行 create 命令。例如,当更改位置或网络,或者当家庭互联网连接每晚更新 IP 地址时,公共 IP 地址会更改。当运行 Ansible 的主机的 IP 地址无法连接时,显示的消息是 Failed to connect to the host via ssh

  1. 安装所需的 Ansible AWS 集合。

    ./aws_ec2.sh requirements
  2. 创建 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 地址重新创建主机清单文件。

调试 EC2 实例

要分析 EC2 实例上的问题,请使用 ssh 使用安装步骤中创建的密钥在实例上打开一个 shell。请参阅清单文件以获取 EC2 实例的 IP 地址。

ssh ec2-user@<ip> -i benchmark_<user>_<region>.pem

当不再需要时,删除区域中的所有 EC2 负载生成器节点

./aws_ec2.sh delete <REGION>

这将删除实例和相关资源,以及本地清单文件和私钥。

基准测试

文件夹布局

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 运行基准测试

Playbook 解析一些参数以生成输出结构并分配负载,因此需要参数 scenario。如果提供了参数 concurrent-users,则它需要是负载分配到的 EC2 节点的倍数。

使用参数 concurrent-usersusers-per-sec 来指定针对 Keycloak 实例运行的总负载。Playbook 读取命令行上提供的 concurrent-usersusers-per-sec,并将这些数字除以 EC2 实例的数量,然后再将值传递给在 EC2 实例上运行的每个 kcb.sh 脚本。

./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 日志和返回代码。