跳至內容

使用 SLO 進行簡單的效能測試

發佈於:2022-07-19 ,  修訂於:2024-01-17

使用 SLO 進行簡單的效能測試

作者:Srinivasan Parthasarathy,資深研究科學家兼經理,DevSecOps @ IBM 研究

效能測試是穩健交付 HTTP 和 gRPC 服務的核心建構區塊。實現此目標的一種方法是向目標服務發送一系列請求,並評估回應是否存在錯誤和與延遲相關的違規。從開發人員的角度來看,這種方法有三個主要考慮因素,即:i) 請求串流的負載相關特性,例如請求速率;ii) 請求的形狀,特別是服務是否需要作為請求的一部分發送任何有效負載/資料;以及 iii) 用於驗證目標服務品質的服務等級目標 (SLO)。

您可以使用開源 Kubernetes 發佈最佳化工具 Iter8,在幾秒鐘內靈活地啟動 Knative 服務的效能測試,並精確控制上述所有內容。本文介紹了這些功能。

Iter8 概述

Iter8 是為 DevOps、MLOps、SRE 和資料科學團隊建構的 Kubernetes 發佈最佳化工具。Iter8 可以輕鬆確保 Kubernetes 應用程式和 ML 模型效能良好並最大化業務價值。

Iter8 支援以下使用案例。

  1. HTTP 服務的效能測試和 SLO 驗證。
  2. gRPC 服務的效能測試和 SLO 驗證。
  3. 使用來自任何資料庫或 REST API 的自訂指標進行 SLO 驗證。

Iter8 實驗

Iter8 引入了實驗的概念,這是一個按特定順序執行的可配置任務清單。

Iter8 experiment

為什麼選擇 Iter8?

Iter8 包含許多強大的功能,可促進 Kubernetes 應用程式的測試和實驗。其中包括以下內容。

  1. 產生負載並收集 HTTP 和 gRPC 服務的內建指標。 透過消除設定和使用指標資料庫的需求,簡化了效能測試。
  2. 定義完善的服務等級目標 (SLO) 概念。 可以輕鬆地在實驗中定義和驗證 SLO。
  3. 自訂指標。 可以在實驗中使用來自任何資料庫或 REST API 的自訂指標。
  4. 就緒檢查。 實驗的效能測試部分僅在服務準備就緒後才開始。
  5. HTML/文字報告。 透過視覺見解促進對實驗結果的人為理解。
  6. 斷言。 驗證目標應用程式在實驗後是否滿足指定的 SLO。簡化 CI/CD/GitOps 管道中的自動化:根據斷言為 true 或 false 分支到不同的路徑。
  7. 多迴圈實驗。 實驗任務可以定期執行(多迴圈),而不是僅執行一次(單迴圈)。這使 Iter8 能夠在每個迴圈中刷新指標值並使用最新的指標值執行 SLO 驗證。
  8. 隨處進行實驗。 Iter8 實驗可以在 Kubernetes 叢集內、本機環境中或 GitHub Actions 管道內啟動。

快速入門

使用 brew 安裝 Iter8 CLI,如下所示。您也可以按照此處所述,使用預先建置的二進位檔案安裝。

brew tap iter8-tools/iter8
brew install iter8@0.11

教學:Knative HTTP 服務的效能測試

在本教學中,我們將啟動一個 Iter8 實驗,該實驗會產生 Knative HTTP 服務的負載、收集 Iter8 的內建 HTTP 指標,並驗證指定的服務等級目標 (SLO)。此實驗如下圖所示。

HTTP performance test

在您的 Kubernetes 叢集中安裝 Knative,並按照此 Knative 教學中所述部署您的 Knative HTTP 服務。

如下所示啟動 Iter8 實驗。

iter8 k launch \
--set "tasks={ready,http,assess}" \
--set ready.ksvc=hello \
--set http.url=http://hello.default.svc.cluster.local:80 \
--set http.numRequests=100 \
--set http.connections=10 \
--set http.qps=20 \
--set assess.SLOs.upper.http/latency-mean=200 \
--set assess.SLOs.upper.http/error-count=0 \
--set runner=job
關於此實驗

此實驗包含三個任務,即:readyhttpassess

ready 任務會檢查名為 hello 的 Knative 服務是否存在且已準備就緒。

http 任務會發送 HTTP 請求並收集Iter8 的內建 HTTP 指標。它設定為以每秒 20 個請求 (qps) 的速率,透過 10 個並行連線 (connections) 發送 100 個請求 (numRequests)。此任務會將其請求發送到叢集本機 URL http://httpbin.default/get

assess 任務會驗證應用程式是否滿足指定的 SLO:i) 服務的平均延遲時間不超過 200 毫秒,以及 ii) 沒有錯誤。

runner 參數的值設定為 job,這使 Iter8 能夠使用 Kubernetes job 工作負載 來執行此實驗。

檢視實驗報告

一旦實驗完成(約 5 秒),請按照以下方式檢視實驗報告。

iter8 k report
文字報告如下所示
Experiment summary:
*******************

  Experiment completed: true
  No task failures: true
  Total number of tasks: 1
  Number of completed tasks: 1

Latest observed values for metrics:
***********************************

  Metric                              |value
  -------                             |-----
  built-in/http-error-count           |0.00
  built-in/http-error-rate            |0.00
  built-in/http-latency-max (msec)    |203.78
  built-in/http-latency-mean (msec)   |17.00
  built-in/http-latency-min (msec)    |4.20
  built-in/http-latency-p50 (msec)    |10.67
  built-in/http-latency-p75 (msec)    |12.33
  built-in/http-latency-p90 (msec)    |14.00
  built-in/http-latency-p95 (msec)    |15.67
  built-in/http-latency-p99 (msec)    |202.84
  built-in/http-latency-p99.9 (msec)  |203.69
  built-in/http-latency-stddev (msec) |37.94
  built-in/http-request-count         |100.00
iter8 k report -o html > report.html # view in a browser
HTML 報告如下所示

HTML report

教學:Knative gRPC 服務的效能測試

在本教學中,我們將啟動一個 Iter8 實驗,該實驗會為 Knative gRPC 服務產生負載,收集 Iter8 的內建 gRPC 指標,並驗證指定的服務等級目標 (SLO)。此實驗如下圖所示。

gRPC performance test

使用 Knative (kn) CLI上方教學中部署的 Knative 服務更新為 gRPC 服務,如下所示。

kn service update hello \
--image docker.io/grpc/java-example-hostname:latest \
--port h2c:50051 \
--revision-name=grpc

如下所示啟動 Iter8 實驗。

iter8 k launch \
--set "tasks={ready,grpc,assess}" \
--set ready.ksvc=hello \
--set grpc.host="hello.default.svc.cluster.local:80" \
--set grpc.call="helloworld.Greeter.SayHello" \
--set grpc.total=100 \
--set grpc.concurrency=10 \
--set grpc.rps=20 \
--set grpc.protoURL="https://raw.githubusercontent.com/grpc/grpc-java/master/examples/example-hostname/src/main/proto/helloworld/helloworld.proto" \
--set grpc.data.name="frodo" \
--set assess.SLOs.upper.grpc/error-rate=0 \
--set assess.SLOs.upper.grpc/latency/mean=400 \
--set assess.SLOs.upper.grpc/latency/p90=500 \
--set runner=job  \
--set logLevel=debug \
--noDownload
關於此實驗

此實驗包含三個任務,分別是 readygrpcassess

ready 任務會檢查名為 hello 的 Knative 服務是否存在且已就緒。

grpc 任務會傳送 gRPC 呼叫請求並收集 Iter8 的內建 gRPC 指標。它被設定為以每秒 20 個請求 (rps) 的速率,透過 10 個並行連線 (concurrency) 傳送 100 個 total 請求。該任務將其請求傳送至主機位址為 hello.default:50051 的叢集本機 gRPC 服務的 helloworld.Greeter.SayHello 方法。該任務也配置了 gRPC 服務的 protobuf 規格,可從 protoURL 取得。該任務傳送的每個請求都包含一個 protobuf 序列化資料物件,其中有一個名為 name 的欄位,其值為 frodo

assess 任務會驗證應用程式是否滿足指定的 SLO:i) 沒有錯誤,ii) 服務的平均延遲時間不超過 400 毫秒,以及 iii) 第 90 百分位數延遲時間不超過 500 毫秒。

runner 參數的值設定為 job,這使 Iter8 能夠使用 Kubernetes job 工作負載 來執行此實驗。

Iter8 實驗圖表已在上述 HTTP 教學 中下載。--noDownload 會重複使用先前下載的圖表。

檢視實驗報告

一旦實驗完成(約 5 秒),請按照 HTTP 教學中所述的方式檢視實驗報告。

下一步?

嘗試以下增強功能和上述教學的變化版本。

  1. 使用您自己的 Knative HTTP 服務嘗試 HTTP 教學。至少,您需要修改 ready.ksvchttp.url 參數,以符合您的服務。您還可以探索 http 任務 的其他參數,以設定請求數量、每秒查詢次數、持續時間、並行連線數量,以及各種請求承載類型。
  2. 使用您自己的 Knative gRPC 服務嘗試 gRPC 教學。至少,您需要修改 ready.ksvcgrpc.hostgrpc.callgrpc.datagrpc.protoURL 參數,以符合您的服務。您還可以探索 grpc 任務 的其他參數,以設定請求數量、每秒查詢次數、持續時間、並行連線數量,以及各種請求承載類型。您也可以使用 grpc 任務 來進行串流 gRPC 的效能測試。
  3. 根據 Iter8 的內建 HTTP 指標,使用其他 SLO 設定上述 HTTP 教學 中使用的 assess 任務。同樣地,根據 Iter8 的內建 gRPC 指標,使用其他 SLO 設定上述 gRPC 教學 中使用的 assess 任務
  4. 此範例 中所述,斷言實驗結果、檢視實驗日誌並清理實驗。如 此範例 中所述,在您的本機環境中而不是 Kubernetes 叢集中執行實驗。

我們使用分析和 Cookie 來了解網站流量。您使用我們網站的資訊會為此目的與 Google 分享。瞭解更多。