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 工作线程之间分配。这对于使用较少连接数和完美 keep-alive 的基准测试尤其重要。你应该意识到,Envoy 会将给定连接的所有流分配给单个工作线程。这意味着,例如如果你有 72 个逻辑核心和工作线程,但是只有来自负载生成器的单个 HTTP/2 连接,则只有 1 个工作线程处于活动状态。

  • 确保请求发布时间预期与预期目标保持一致。一些负载生成器会自然地产生抖动和/或分批的时序。在某些测试中,这可能最终成为意想不到的主导因素。

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

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

  • 你要重视引导程序或 xDS 配置。理想情况下,每一行配置都是有深意的,并且对于所考虑的基准测试来说是必要的。

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

  • 在基准测试程序运行时检查 Envoy 的 perf 文件,例如使用 火焰图 。确保 Envoy 正在花费时间进行预期测试中的重要工作,而不是一些无关的工作。

  • 熟悉 延迟测量最佳实践 。特别是,不要测量最大负载下的延迟时间,这通常没有意义,也不能反映真实的系统性能;目的是测量低于 QPS 延迟曲线拐点的延迟时间。优先选择开环负载生成器与闭环负载生成器。

  • 避免 基准测试五宗罪