通过 Ansible 和 EC2 运行基准测试
这通过使用 Ansible 为 Amazon Web Services EC2 实例进行自动化设置,扩展了 kcb.sh 脚本的通用 CLI,以运行负载测试。
当单个实例不足以生成负载时,例如,由于状态为 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-999.0.0-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 文件夹中。
📒 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 日志和返回代码。 |