Envoy 的基准测试最佳实践?

没有一个单一的 QPS、延迟或吞吐量开销可以表征像 Envoy 这样的网络代理。相反,任何测量都需要上下文感知,通过适当地配置和负载测试 Envoy 来确保与其他系统的苹果对苹果的比较。因此,我们无法提供规范的基准测试配置,而是提供以下指导

  • 应使用发布的 Envoy 二进制文件。如果正在构建,请确保在 Bazel 命令行上使用 -c opt。使用 Envoy 点版本时,请确保使用最新的点版本;鉴于 Envoy 开发的步伐,在声明 Envoy 性能时,选择旧版本是不合理的。同样,如果在主构建中工作,请尽职尽责,确保您的基准测试工作附近没有发生回归或性能改进,并且您接近 HEAD。

  • 应取消设置 --concurrency Envoy CLI 标志(在您的机器上为每个逻辑核心提供一个工作线程)或设置为匹配在比较中提供给其他网络代理的内核/线程数量。

  • 禁用 断路器。基准测试期间常见的错误是 Envoy 的默认断路器限制很低,导致连接和请求排队。

  • 禁用 generate_request_id

  • 禁用 dynamic_stats。如果您正在测量与直接连接相比的开销,您可能需要考虑通过 reject_all禁用所有统计信息。

  • 确保网络和 HTTP 过滤器链反映了 Envoy 与之比较的系统中的可比功能。

  • 确保 TLS 设置(如果有)是现实的,并且在任何比较中使用一致的密码。会话重用可能会对结果产生重大影响,应通过 侦听器 SSL 统计信息进行跟踪。

  • 确保 HTTP/2 设置,尤其是影响流量控制和流并发性的设置,在任何比较中都是一致的。在优化任何 HTTP/2 设置时,理想情况下要考虑 BDP 和网络链路延迟。

  • 在侦听器和集群统计信息中验证流、连接和错误的数量是否符合任何给定实验中的预期。

  • 确保您了解负载生成器创建的连接如何在 Envoy 工作线程中分布。这对使用低连接计数和完美保持活动连接的基准测试尤其重要。您应该知道 Envoy 会将给定连接的所有流分配给单个工作线程。这意味着,例如,如果您有 72 个逻辑内核和工作线程,但负载生成器只有一个 HTTP/2 连接,那么只有一个工作线程会处于活动状态。

  • 确保请求-释放时间期望值与预期相符。一些负载生成器会产生自然抖动和/或批处理时间。这最终可能会成为某些测试中意外的主要因素。

  • 负载生成器如何重用连接的具体细节是一个重要因素(例如 MRU、随机、LRU 等),因为这会影响工作分配。

  • 如果您试图测量很小的(例如 < 1ms)延迟,请确保测量工具和环境具有所需的灵敏度,并且噪声底层足够低。

  • 对您的引导或 xDS 配置持批判态度。理想情况下,每一行都有动机,并且对于所考虑的基准测试是必要的。

  • 考虑使用 Nighthawk 作为您的负载生成器和测量工具。我们致力于在此工具中构建基准测试和延迟测量最佳实践。

  • 检查基准测试运行期间 Envoy 的 perf 配置文件,例如使用 火焰图。验证 Envoy 是否将时间花在进行预期测试下的必要工作上,而不是一些无关或次要的工作上。

  • 熟悉 延迟测量最佳实践。特别是,永远不要在最大负载下测量延迟,这通常没有意义,也不能反映真实系统的性能;目标是在 QPS-延迟曲线的膝盖以下测量。更喜欢开放式而不是闭环负载生成器。

  • 避免 基准测试罪行