通过 Ansible 和 EC2 运行基准测试
这扩展了 kcb.sh 脚本的通用 CLI,通过使用 Ansible 自动设置 Amazon Web Services EC2 实例来运行负载测试。
当单个实例不足以进行负载生成时使用,例如当网络连接由于状态为 TIMED_WAIT
的连接过多而无法快速建立时。它还有助于你在相同或不同的 AWS 区域中拥有负载驱动程序,以获得最小的延迟或模拟用户观察到的延迟。
先决条件
-
来自 准备 Keycloak 以进行测试 的 Keycloak URL
-
安装 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
。
-
安装所需的 Ansible AWS 集合。
./aws_ec2.sh requirements
-
创建 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 地址重新创建主机清单文件。
基准测试
文件夹布局
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-users
或 users-per-sec
来指定针对 Keycloak 实例运行的总负载。Playbook 会读取命令行上提供的 concurrent-users
或 users-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 日志和返回码。 |