最佳实践:服务网格性能基准测试

用于评估 Istio 数据平面性能的工具和指南。

2019年7月9日 | 作者:Megan O'Keefe - Google,John Howard - Google,Mandar Jog - Google

服务网格为应用程序部署添加了许多功能,包括流量策略可观测性安全通信。但是,将服务网格添加到您的环境会产生成本,无论是时间(增加延迟)还是资源(CPU 周期)。为了对是否将服务网格用于您的用例做出明智的决定,评估应用程序在与服务网格一起部署时的性能非常重要。

今年早些时候,我们发布了一篇关于 Istio 在 1.1 版中性能改进的博文。在发布Istio 1.2之后,我们希望提供指导和工具来帮助您在生产就绪的 Kubernetes 环境中对 Istio 的数据平面性能进行基准测试。

总的来说,我们发现 Istio 的边车代理延迟会随着并发连接数的增加而增加。在每秒 1000 个请求 (RPS) 下,跨 16 个连接,Istio 在第 50 个百分位数处每个请求增加3 毫秒,在第 99 个百分位数处增加10 毫秒

Istio 工具存储库中,您将找到用于测量 Istio 数据平面性能的脚本和说明,以及有关如何使用另一个服务网格实现Linkerd运行这些脚本的其他说明。请继续阅读,我们将详细介绍性能测试框架每个步骤的一些最佳实践。

1. 使用生产就绪的 Istio 安装

为了准确地衡量服务网格在规模上的性能,使用适当大小的 Kubernetes 集群非常重要。我们在三个工作节点上进行测试,每个节点至少具有 4 个 vCPU 和 15 GB 内存。

然后,重要的是在该集群上使用生产就绪的 Istio 安装配置文件。这使我们能够实现面向性能的设置,例如控制平面 Pod 自动扩展,并确保资源限制适合繁重的流量负载。默认的 Istio 安装适用于大多数基准测试用例。对于使用数千个代理注入服务的广泛性能基准测试,我们还提供调整后的 Istio 安装,该安装为 Istio 控制平面分配额外的内存和 CPU。

Istio 的演示安装不适合性能测试,因为它旨在部署在小型试验集群上,并且启用了完整的跟踪和访问日志以展示 Istio 的功能。

2. 集中于数据平面

我们的基准测试脚本侧重于评估 Istio 数据平面:在应用程序容器之间中介流量的Envoy 代理。为什么专注于数据平面?因为在规模上,随着大量应用程序容器的出现,数据平面的内存CPU使用量很快就会超过 Istio 控制平面。让我们来看一个这种情况如何发生的例子

假设您运行 2000 个 Envoy 注入的 Pod,每个 Pod 每秒处理 1000 个请求。每个代理使用 50 MB 内存,并且为了配置所有这些代理,Pilot 使用 1 个 vCPU 和 1.5 GB 内存。总而言之,Istio 数据平面(所有 Envoy 代理的总和)使用 100 GB 内存,而 Pilot 使用 1.5 GB。

出于延迟原因,专注于数据平面性能也很重要。这是因为大多数应用程序请求都通过 Istio 数据平面而不是控制平面移动。有两个例外

  1. 遥测报告:每个代理都会将原始遥测数据发送到 Mixer,Mixer 会将这些数据处理成指标、跟踪和其他遥测数据。原始遥测数据类似于访问日志,因此会产生成本。访问日志处理会消耗 CPU 并阻止工作线程获取下一个工作单元。在更高的吞吐量下,下一个工作单元更有可能在队列中等待工作线程获取。这可能导致 Envoy 的长尾(第 99 个百分位数)延迟。
  2. 自定义策略检查:当使用自定义 Istio 策略适配器时,策略检查位于请求路径上。这意味着数据路径上的请求标头和元数据将发送到控制平面 (Mixer),从而导致更高的请求延迟。注意:这些策略检查默认情况下处于禁用状态,因为最常见的策略用例(RBAC)完全由 Envoy 代理执行。

这两个例外都将在未来的 Istio 版本中消失,届时Mixer V2 将所有策略和遥测功能直接移动到代理中。

接下来,在规模上测试 Istio 数据平面性能时,不仅要测试每秒请求数的增加,还要针对并发连接数的增加进行测试。这是因为现实世界中的高吞吐量流量来自多个客户端。提供的脚本允许您使用任意数量的并发连接执行相同的负载测试,并在增加 RPS 的同时执行。

最后,我们的测试环境测量两个 Pod 之间的请求,而不是多个 Pod 之间的请求。客户端 Pod 是Fortio,它向服务器 Pod 发送流量。

为什么只用两个 Pod 进行测试?因为扩展吞吐量 (RPS) 和连接 (线程) 对 Envoy 的性能的影响大于增加服务注册表的大小——或者说,Kubernetes 集群中 Pod 和服务的总数。当服务注册表的大小增长时,Envoy 确实需要跟踪更多的端点,并且每个请求的查找时间确实会增加,但增加的幅度很小。如果您有很多服务,并且这个常数成为延迟问题,Istio 提供了一个Sidecar 资源,它允许您限制每个 Envoy 知道的服务。

3. 使用和不使用代理进行测量

虽然许多 Istio 功能(例如双向 TLS 身份验证)依赖于应用程序 Pod 旁边的 Envoy 代理,但您可以有选择地禁用某些网格服务的边车代理注入。当您为生产环境扩展 Istio 时,您可能希望将边车代理增量添加到您的工作负载中。

为此,测试脚本提供了三种不同的模式。这些模式分析请求通过客户端和服务器代理 (both)、仅服务器代理 (serveronly) 和两个代理都不通过 (baseline) 时 Istio 的性能。

您还可以禁用Mixer以在性能测试期间停止 Istio 的遥测,这提供了与 Mixer V2 工作完成后我们预期的性能一致的结果。Istio 还支持Envoy 原生遥测,其性能类似于禁用 Istio 的遥测。

Istio 1.2 性能

让我们看看如何使用此测试环境来分析 Istio 1.2 的数据平面性能。我们还提供了运行Linkerd 数据平面的相同性能测试的说明。目前,Linkerd 仅支持延迟基准测试。

为了测量 Istio 的边车代理延迟,我们查看了在并发连接数增加的情况下第 50、90 和 99 个百分位数,同时保持请求吞吐量 (RPS) 不变。

我们发现,在 16 个并发连接和 1000 RPS 下,当请求通过客户端和服务器代理时,Istio 比基线 (P50) 多增加了3 毫秒。(从绿色线 both 中减去粉红色线 base。)在 64 个并发连接下,Istio 比基线多增加了12 毫秒,但在禁用 Mixer (nomixer_both) 的情况下,Istio 仅增加了7 毫秒

Istio sidecar proxy, 50th percentile latency

在第 90 个百分位数处,在 16 个并发连接下,Istio 多增加了6 毫秒;在 64 个连接下,Istio 多增加了20 毫秒

Istio sidecar proxy, 90th percentile latency

最后,在第 99 个百分位数处,在 16 个连接下,Istio 比基线多增加了10 毫秒。在 64 个连接下,Istio 在启用 Mixer 的情况下多增加了25 毫秒,或在禁用 Mixer 的情况下多增加了10 毫秒

Istio sidecar proxy, 99th percentile latency

对于 CPU 使用率,我们通过增加请求吞吐量 (RPS) 并保持并发连接数恒定来进行测量。我们发现 Envoy 在 3000 RPS 下启用 Mixer 时的最大 CPU 使用率为1.2 个 vCPU。在 1000 RPS 下,一个 Envoy 使用大约半个 CPU。

Istio sidecar proxy, max CPU usage

总结

在对 Istio 的性能进行基准测试的过程中,我们学习了一些关键经验教训

对于在 16 个连接上具有 1000 RPS 的网格,Istio 1.2 在第 50 个百分位数处仅比基线多增加了3 毫秒的延迟。

还可以查看Istio 性能和可扩展性指南,以获取最新的性能数据。

感谢您的阅读,并祝您基准测试愉快!

分享此文章