使用 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 支援以下使用案例。
- HTTP 服務的效能測試和 SLO 驗證。
- gRPC 服務的效能測試和 SLO 驗證。
- 使用來自任何資料庫或 REST API 的自訂指標進行 SLO 驗證。
Iter8 實驗¶
Iter8 引入了實驗的概念,這是一個按特定順序執行的可配置任務清單。
為什麼選擇 Iter8?
Iter8 包含許多強大的功能,可促進 Kubernetes 應用程式的測試和實驗。其中包括以下內容。
- 產生負載並收集 HTTP 和 gRPC 服務的內建指標。 透過消除設定和使用指標資料庫的需求,簡化了效能測試。
- 定義完善的服務等級目標 (SLO) 概念。 可以輕鬆地在實驗中定義和驗證 SLO。
- 自訂指標。 可以在實驗中使用來自任何資料庫或 REST API 的自訂指標。
- 就緒檢查。 實驗的效能測試部分僅在服務準備就緒後才開始。
- HTML/文字報告。 透過視覺見解促進對實驗結果的人為理解。
- 斷言。 驗證目標應用程式在實驗後是否滿足指定的 SLO。簡化 CI/CD/GitOps 管道中的自動化:根據斷言為 true 或 false 分支到不同的路徑。
- 多迴圈實驗。 實驗任務可以定期執行(多迴圈),而不是僅執行一次(單迴圈)。這使 Iter8 能夠在每個迴圈中刷新指標值並使用最新的指標值執行 SLO 驗證。
- 隨處進行實驗。 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)。此實驗如下圖所示。
在您的 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
關於此實驗
此實驗包含三個任務,即:ready、http 和 assess。
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 報告如下所示
教學:Knative gRPC 服務的效能測試¶
在本教學中,我們將啟動一個 Iter8 實驗,該實驗會為 Knative gRPC 服務產生負載,收集 Iter8 的內建 gRPC 指標,並驗證指定的服務等級目標 (SLO)。此實驗如下圖所示。
使用 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
關於此實驗
此實驗包含三個任務,分別是 ready
、grpc
和 assess
。
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 教學中所述的方式檢視實驗報告。
下一步?¶
嘗試以下增強功能和上述教學的變化版本。
- 使用您自己的 Knative HTTP 服務嘗試
HTTP 教學
。至少,您需要修改ready.ksvc
和http.url
參數,以符合您的服務。您還可以探索
的其他參數,以設定請求數量、每秒查詢次數、持續時間、並行連線數量,以及各種請求承載類型。http
任務 - 使用您自己的 Knative gRPC 服務嘗試
gRPC 教學
。至少,您需要修改ready.ksvc
、grpc.host
、grpc.call
、grpc.data
和grpc.protoURL
參數,以符合您的服務。您還可以探索
的其他參數,以設定請求數量、每秒查詢次數、持續時間、並行連線數量,以及各種請求承載類型。您也可以使用grpc
任務
來進行串流 gRPC 的效能測試。grpc
任務 - 根據
Iter8 的內建 HTTP 指標
,使用其他 SLO 設定上述HTTP 教學
中使用的assess 任務
。同樣地,根據Iter8 的內建 gRPC 指標
,使用其他 SLO 設定上述gRPC 教學
中使用的assess 任務
。 - 如
此範例
中所述,斷言實驗結果、檢視實驗日誌並清理實驗。如此範例
中所述,在您的本機環境中而不是 Kubernetes 叢集中執行實驗。