通过 Ansible 和 EC2 运行基准测试

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

当单个实例不足以进行负载生成时使用,例如当网络连接由于状态为 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-0.14-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/
└─📂  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 日志和返回码。