使用 SLO 进行简单的性能测试 ¶
发布时间:2022-07-19 , 修订时间:2024-01-17
使用 SLO 进行简单的性能测试¶
作者:Srinivasan Parthasarathy,高级研究科学家和经理,DevSecOps @ IBM 研究院
性能测试是稳健交付 HTTP 和 gRPC 服务的核心构建块。一种实现方法是向目标服务发送一系列请求,并评估响应以查找错误和与延迟相关的违规。从开发人员的角度来看,这种方法有三个主要考虑因素,即 i) 请求流的负载相关特性,例如请求率;ii) 请求的形状,特别是服务是否需要任何有效负载/数据作为请求的一部分发送;以及 iii) 用于验证目标服务质量的服务级别目标 (SLO)。
您可以使用 Iter8(开源 Kubernetes 版本优化器)灵活地**在几秒钟内**为 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 管道中的自动化:根据断言是真还是假,分支到不同的路径。
- **多循环实验。** 实验任务可以定期执行(多循环),而不仅仅执行一次(单循环)。这使 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)。该实验在下面的图中进行了说明。
按照本 Knative 教程中的说明在您的 Kubernetes 集群中安装 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 作业工作负载来运行此实验。
查看实验报告¶
实验完成后(约 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 指标。它被配置为发送 100 个 total
请求,跨 10 个并发连接 (concurrency
),每秒 20 个请求 (rps
)。该任务将其请求发送到集群本地 gRPC 服务的 helloworld.Greeter.SayHello
方法,其主机地址为 hello.default:50051
。该任务还配置了 gRPC 服务的 protobuf 规范,可从 protoURL
获取。该任务发送的每个请求都包含一个 protobuf 序列化数据对象,其中包含一个名为 name
的字段,其值为 frodo
。
该 assess 任务验证应用程序是否满足指定的 SLO:i) 没有错误,ii) 服务的平均延迟不超过 400 毫秒,以及 iii) 第 90 个百分位延迟不超过 500 毫秒。
runner 参数的值设置为job
,这使 Iter8 能够使用Kubernetes 作业工作负载来运行此实验。
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 教程 中使用的 评估任务。类似地,使用基于 Iter8 内置的 gRPC 指标 的其他 SLO 配置上述 gRPC 教程 中使用的 评估任务。
- 断言实验结果,查看实验日志并清理实验,如 此示例 中所述。在您的本地环境中而不是 Kubernetes 集群中运行实验,如 此示例 中所述。