跳到内容

使用 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 支持以下用例。

  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 管道中的自动化:根据断言是真还是假,分支到不同的路径。
  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

按照本 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
关于此实验

此实验包含三个任务,即 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 作业工作负载来运行此实验。

查看实验报告

实验完成后(约 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 指标。它被配置为发送 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 教程 中的说明查看实验报告。

下一步

尝试以下对上述教程的增强和变体。

  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 教程 中使用的 评估任务。类似地,使用基于 Iter8 内置的 gRPC 指标 的其他 SLO 配置上述 gRPC 教程 中使用的 评估任务
  4. 断言实验结果,查看实验日志并清理实验,如 此示例 中所述。在您的本地环境中而不是 Kubernetes 集群中运行实验,如 此示例 中所述。

我们使用分析和 Cookie 来了解网站流量。有关您使用我们网站的信息将与 Google 共享,以实现该目的。了解更多。