尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Envoy 性能基准测试实战指南:从构建、配置到测量的最佳实践

Envoy 性能基准测试实战指南:从构建、配置到测量的最佳实践 Envoy 性能基准测试实战指南从构建、配置到测量的最佳实践【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoyEnvoy 是一个云原生高性能边缘/中间/服务代理但Envoy 到底有多快并没有一个放之四海而皆准的答案。本文以 docs/root/faq/performance/how_to_benchmark_envoy.rst 为骨架系统梳理 Envoy 官方给出的基准测试最佳实践从正确的二进制构建、--concurrency线程模型到关闭 circuit breaking、generate_request_id、dynamic_stats等影响测量的配置项再到负载生成器选型、统计校验与perf剖析。读完本文你将掌握一套可复现、可对照、可审查的 Envoy 性能基准测试方法论能够在自己的环境中得到可信的 QPS 与延迟数据。一、为什么 Envoy 没有一个官方基准数字任何针对 Envoy 的基准测试首先要接受一个前提不存在单一的 QPS、延迟或吞吐开销数字能够刻画 Envoy 这类网络代理。Envoy 官方在 docs/root/faq/performance/how_fast_is_envoy.rst 中明确说明它取决于具体情况——性能在很大程度上取决于启用了哪些 Envoy 特性以及运行环境而且做精确的性能测试本身就是一项极其困难的工作项目团队目前没有资源去维护官方基准。Envoy 团队在关键路径上做了大量性能调优相信其表现优异但并不发布任何官方 benchmark。官方鼓励用户在自己的环境中使用与生产计划类似的配置来对 Envoy 做基准测试。因此本文提供的就是一套上下文感知contextually aware的测试规范确保与其他系统对比时做到 apples-to-apples 的公平比较而不是追求一个脱离场景的绝对数字。二、构建基准用正确的二进制做测试性能测试的第一步是确保被测对象本身是发布级的否则结果没有任何参考价值使用 release 版本的 Envoy 二进制。如果自己构建必须在 Bazel 命令行中使用-c opt否则默认的调试构建-c dbg会带来显著的性能失真无法代表真实运行表现。使用最新的 point release。Envoy 开发节奏很快老版本在性能上往往落后于当前版本用旧版本得出的结论不足以代表 Envoy 的真实性能水平。若基于 main 分支开发构建请做足功课确认在你的 benchmark 工作附近没有合入性能回退regression或性能改进的提交并且尽量贴近 HEAD。这一点可以通过检查changelogs/目录下对应版本的变更记录来辅助判断。构建产物通常位于 Bazel 的bazel-bin/source/exe/envoy具体路径取决于构建配置基准测试请始终使用该优化后的产物。三、并发模型正确设置--concurrencyEnvoy 采用多 worker 线程模型每个 worker 线程独立运行事件循环处理各自监听 socket 上的连接。从 source/server/active_udp_listener.cc 的实现可以看到worker_index与concurrency是驱动监听器分配的核心参数所有连接都会被分发到具体的 worker 线程。针对--concurrency官方建议不设置该标志让 Envoy 默认按机器的逻辑核心数创建 worker 线程每逻辑核一个线程或者显式设置为与对比系统中其他网络代理可用的核心/线程数一致以保证对比公平。一个必须牢记的细节Envoy 会把同一连接上的所有 stream 分配到同一个 worker 线程。这意味着如果负载生成器只建立了一条 HTTP/2 连接那么即便机器有 72 个逻辑核、72 个 worker 线程实际也只有 1 个 worker 线程在工作。低连接数 完美 keep-alive 的基准测试尤其容易踩到这个坑后面负载生成器一节会进一步展开。四、配置基线关掉会干扰测量的特性基准测试配置的核心原则是bootstrap 或 xDS 配置中每一行都应有动机都是该测试场景所必需的。以下是官方点名要求调整的关键项。4.1 关闭熔断circuit breaking基准测试中最常见的问题之一Envoy 默认的熔断阈值偏低导致测试中出现连接和请求排队QPS 与延迟被严重扭曲。官方 FAQ docs/root/faq/load_balancing/disable_circuit_breaking.rst 指出Envoy 目前没有一个开关能彻底关闭熔断但可以通过把阈值设到极大值来等效禁用。下面这份配置将各类阈值设为1000000000接近std::numeric_limitsuint32_t::max()的语义覆盖 DEFAULT 与 HIGH 两个优先级circuit_breakers: thresholds: - priority: DEFAULT max_connections: 1000000000 max_pending_requests: 1000000000 max_requests: 1000000000 max_retries: 1000000000 - priority: HIGH max_connections: 1000000000 max_pending_requests: 1000000000 max_requests: 1000000000 max_retries: 1000000000字段定义见 api/envoy/config/cluster/v3/circuit_breaker.protomax_connections限制到上游集群的最大连接数max_pending_requests限制等待可用连接的排队请求数max_requests限制任意时刻在途的最大请求数max_retries限制重试请求数。Envoy 支持在路由级别做优先级路由你可以据此调整对应优先级的阈值。4.2 关闭generate_request_idHTTP 连接管理器默认会为每个请求生成x-request-id头UUID4。在 api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto 的字段注释中写得非常直白生成随机 UUID4 是昂贵的expensive在高吞吐场景下如果不需要该特性应将其关闭。配置如下http_filters: - name: envoy.filters.http.router typed_config: type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager generate_request_id: false4.3 关闭dynamic_stats必要时用reject_all禁用全部统计Router 过滤器默认会生成动态集群统计dynamic cluster statistics默认值为true在高性能场景下可以禁用。字段定义见 api/envoy/extensions/filters/http/router/v3/router.protohttp_filters: - name: envoy.filters.http.router typed_config: type: type.googleapis.com/envoy.extensions.filters.http.router.v3.Router dynamic_stats: false如果你的目标是测量 Envoy相对于直连direct connection的开销那么应该考虑把统计功能整体关掉。通过stats_config中的 StatsMatcher.reject_all 可以实现当reject_all为true时不会实例化任何统计no stats will be instantiated将统计开销降到零stats_config: stats_matcher: reject_all: true4.4 对齐网络与 HTTP 过滤器链确保被测的 networking 与 HTTP 过滤器链与对比系统中启用的特性是可比的。例如你对比的是一个直连的裸 TCP 转发就不要在 Envoy 这边挂上一堆认证、限流、熔断等过滤器反之亦然。过滤器的数量与复杂度直接决定每请求的开销任何不对称都会让对比结论失真。4.5 使用现实的 TLS 配置如果测试包含 TLS确保 TLS 设置是现实的符合真实部署场景并且在对比中使用一致的 cipher 套件会话复用session reuse对结果影响显著必须通过监听器 SSL 统计跟踪其行为。Envoy 的 TLS 统计根植于listener.address.ssl.*详见 docs/root/configuration/listeners/stats.rst。例如ssl.handshake相关计数可用于判断握手次数与会话复用是否如预期避免测试里大量 TLS 握手但配置却是关闭复用这类失真场景。4.6 统一 HTTP/2 设置HTTP/2 的流量控制与流并发参数必须保证对比双方一致。核心字段定义在 api/envoy/config/core/v3/protocol.proto 的Http2ProtocolOptions消息中max_concurrent_streams字段 2单个连接上允许的并发 stream 上限initial_stream_window_size字段 3单条 stream 级别的流量控制窗口initial_connection_window_size字段 4连接级别的流量控制窗口。理想情况下优化这些 HTTP/2 设置时要结合 BDP带宽延迟积与网络链路延迟。举一个直观的例子如果客户端与 Envoy 之间存在高延迟链路而过小的initial_connection_window_size会限制在途数据量导致吞吐远低于理论值这与被测系统的 HTTP/2 参数不一致时就会得出错误的对比结论。五、验证实验结果监听器与集群统计每次实验都要在监听器listener和集群cluster统计中核实 stream 数、连接数与错误数是否符合预期。这是排除配置事故的最快手段例如listener 的downstream_cx_active、downstream_rq_active应反映负载生成器的连接/请求规模cluster 的upstream_cx_total、upstream_rq_total应等于预期的上游流量任何错误计数如upstream_rq_5xx、cx_connect_fail的异常增长都提示配置或环境问题。如果统计数字与实验设计对不上那么后续的 QPS/延迟数据再漂亮也是无效的。相关统计字段可对照 docs/root/configuration/listeners/stats.rst 与集群统计文档逐项核对。六、负载生成器最容易引入偏差的一环负载生成器的行为会直接进入测量结果以下是官方重点提醒的几个维度。6.1 连接在 worker 线程间的分布如第三节所述Envoy 将同一连接的所有 stream 固定分配到一个 worker 线程。因此使用低连接数 完美 keep-alive的基准测试时必须清楚你的连接落在哪几个 worker 上72 核机器只开一条 HTTP/2 连接结果只能反映单 worker 的性能而不是 Envoy 的多核吞吐能力。6.2 请求释放request-release时序某些负载生成器会产生天然抖动jittery或成批batchy的请求释放时序这可能意外地成为某些测试的主导因素。应确保请求释放时序与测试意图一致——如果你想测的是稳定状态下的吞吐就不要让负载生成器以突发模式注入请求。6.3 连接复用策略负载生成器如何复用连接MRU、随机、LRU 等会直接影响工作分布。不同的复用策略决定了连接在不同 worker 上的聚集程度进而影响吞吐与尾部延迟必须在对比测试中保持一致。6.4 小延迟测量的灵敏度如果目标是测量很小的延迟例如 1ms请确保测量工具和环境具备相应的灵敏度且噪声地板noise floor足够低。测量工具自身的时钟分辨率、调度抖动、内核 tick 等都会成为瓶颈此时测出来的数字反映的可能是工具而非 Envoy。6.5 推荐的负载生成器Nighthawk官方明确建议考虑使用 Nighthawk 作为负载生成与测量工具——Envoy 项目组承诺在该工具中持续建设 benchmark 与延迟测量最佳实践。它天然与 Envoy 的统计模型、HTTP/2 语义契合能显著降低负载工具偏差。七、剖析与延迟测量让数字经得起推敲7.1 用perf验证 CPU 花在了该花的地方在 benchmark 运行期间对 Envoy 进程采集perfprofile 并生成火焰图flame graphs。目的是验证 Envoy 的时间确实花在了预期的关键工作上而不是某些无关或边缘的工作上。例如如果火焰图中大量时间耗在generate_request_id的 UUID4 生成上说明配置基线没做好对应 4.2 节如果时间大量耗在统计相关的原子操作上说明reject_all或dynamic_stats该启用了对应 4.3 节。7.2 延迟测量永远不要在最大负载下测延迟熟悉延迟测量最佳实践至关重要其核心结论是绝不要在最大负载max load下测量延迟——这通常没有意义也不能反映系统真实性能应在 QPS-延迟曲线的拐点knee以下测量延迟优先使用开放回路open loop负载生成器而不是闭合回路closed loop——闭合回路生成器会等待响应后再发下一个请求天然耦合了被测系统的延迟扭曲结果。7.3 避免 benchmark 反模式最后请警惕常见的benchmarking crimes基准测试罪行例如比较不同硬件上的结果、忽略实验环境差异、只报最优值不报分布、在过小的样本上做结论等。一份可信的基准报告应当包含完整的实验条件、配置版本与原始数据。八、Checklist一次可信的 Envoy 基准测试综合全文给出可执行的核对清单阶段检查项依据构建release 二进制Bazel 加-c opt使用最新 point releasemain 分支测试贴近 HEADdocs/root/faq/performance/how_to_benchmark_envoy.rst并发--concurrency不设置每逻辑核一线程或与对比系统线程数一致同上配置熔断阈值设为极大值max_connections等四项 × DEFAULT/HIGHdocs/root/faq/load_balancing/disable_circuit_breaking.rst配置generate_request_id: falsehttp_connection_manager.proto配置dynamic_stats: false对比直连开销时reject_all: truerouter.proto、stats.proto配置过滤器链对齐、TLS cipher/会话复用一致、HTTP/2 流控参数一致protocol.proto验证核对 listener/cluster 的 stream、连接、错误统计docs/root/configuration/listeners/stats.rst负载关注连接在 worker 间的分布、请求释放时序、连接复用策略docs/root/faq/performance/how_to_benchmark_envoy.rst剖析perf火焰图确认 CPU 花在关键路径延迟在曲线拐点以下测量优先 open loop同上按此清单逐项落实你得到的 Envoy 基准测试结果将具备可重复性、公平性与说服力能够在不同配置、不同系统之间进行真正有意义的横向比较。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表