透過 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-0.14-SNAPSHOT.zip
kcb_heap_size: 1G

安裝並執行效能基準測試

提供區域作為第一個參數,然後提供套用至 kcb.sh 指令碼的參數。請參閱 從 CLI 執行效能基準測試 以了解詳細資訊。

劇本會剖析一些參數以產生輸出結構並分配負載,因此需要參數 scenario。如果提供參數 concurrent-users,則它需要是負載分配到的 EC2 節點的倍數。

使用參數 concurrent-usersusers-per-sec 來指定針對 Keycloak 執行個體執行的總負載。劇本會讀取命令列上提供的 concurrent-usersusers-per-sec,並在將值傳遞給每個在 EC2 執行個體上執行的 kcb.sh 指令碼之前,將這些數字除以 EC2 執行個體的數量。

./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 記錄和傳回碼。