Envoy 连接池核心参数总览:HTTP/1.1 与 HTTP/2 连接池参数差异、关键参数速查表

Envoy 连接池是 Sidecar 代理与上游服务之间维持的 TCP 连接集合,其参数配置直接影响请求延迟、吞吐量和资源消耗。HTTP/1.1 与 HTTP/2 在连接复用模型上存在本质差异,导致连接池参数设计截然不同。本章从协议差异出发,梳理核心参数并给出速查表,帮助你在升级场景中快速定位调优方向。

核心认知:HTTP/1.1 连接池是“多连接并行”模型,每个请求独占一个连接直到响应返回;HTTP/2 连接池是“单连接多路复用”模型,一个连接上可同时承载数百个流。参数设计的出发点完全不同。

2.1 HTTP/1.1 与 HTTP/2 连接复用模型对比

理解连接池参数必须先理解协议复用模型。下图展示了两种协议在 Envoy 连接池中的核心差异:

HTTP/1.1 vs HTTP/2 连接池复用模型 HTTP/1.1 连接池 连接 #1 (请求A) 连接 #2 (请求B) 连接 #3 (请求C) 等待队列 (请求D、E...) HTTP/2 连接池 单一 TCP 连接 (多路复用流) 流1 流2 流3 流4 流5 流6 流7 无等待队列 新请求立即创建新流
模型差异总结:
  • HTTP/1.1:每个连接同一时刻只能处理一个请求。并发请求数 = 连接数。连接耗尽时新请求进入等待队列。
  • HTTP/2:单个连接可承载多个并发流。并发请求数 = 流数(受 max_concurrent_streams 限制)。连接数通常为 1,极少需要多个连接。

2.2 HTTP/1.1 连接池核心参数

HTTP/1.1 连接池参数围绕“连接数量”和“连接生命周期”展开。Envoy 通过 envoy.extensions.upstreams.http.v3.HttpProtocolOptions 配置,核心参数如下:

参数名 类型 默认值 说明
max_requests_per_connection uint32 4294967295 (无限制) 单个连接最多处理的请求数。达到上限后连接关闭,用于防止连接泄漏和负载均衡偏差。
max_connections uint32 4294967295 (无限制) 连接池允许的最大连接数。超过此值的新请求进入等待队列。
max_pending_requests uint32 4294967295 (无限制) 等待可用连接的最大请求数。超过此值直接返回 503。
connect_timeout Duration 5s 建立 TCP 连接的超时时间。超时后请求失败并计入重试逻辑。
idle_timeout Duration 1h 连接空闲超过此时间后关闭。用于回收空闲连接,避免资源浪费。
升级调优重点:在 Service Mesh 升级过程中,如果上游服务从 HTTP/1.1 迁移到 HTTP/2,max_connections 和 max_pending_requests 的默认值(无限制)可能导致连接数爆炸。建议在升级前显式设置合理上限,例如 max_connections: 100,避免 Sidecar 资源耗尽。

2.3 HTTP/2 连接池核心参数

HTTP/2 连接池的核心参数围绕“流控制”和“连接复用”展开。由于多路复用特性,连接数参数退居次要地位,流级参数成为调优焦点:

参数名 类型 默认值 说明
max_concurrent_streams uint32 100 单个 HTTP/2 连接上允许的最大并发流数。超过此值的新请求进入等待队列。
initial_stream_window_size uint32 65535 (64KB) 每个流的初始流量控制窗口大小。增大可提升吞吐量,但会提高内存占用。
initial_connection_window_size uint32 1048576 (1MB) 整个连接的初始流量控制窗口大小。所有流共享此窗口。
max_requests_per_connection uint32 4294967295 (无限制) 与 HTTP/1.1 含义相同,但 HTTP/2 中通常不依赖此参数做连接回收。
connection_keepalive Object 无 连接保活探测配置,包含 interval、timeout、unhealthy_threshold。
关键差异:HTTP/2 连接池的 max_connections 通常保持为 1(默认行为),因为多路复用已能提供足够的并发能力。增加连接数反而会导致 TCP 连接数膨胀和 HOLB(队头阻塞)风险上升。

2.4 关键参数速查表

以下速查表按调优场景分类,帮助你快速定位需要调整的参数:

调优场景 HTTP/1.1 参数 HTTP/2 参数 推荐调整方向
高并发请求 max_connections max_concurrent_streams 增大上限,但需配合上游服务容量评估
请求排队延迟 max_pending_requests 无(流级排队) 增大 max_pending_requests 或增加连接数
吞吐量优化 max_requests_per_connection initial_stream_window_size HTTP/1.1 增大连接复用次数;HTTP/2 增大流窗口
连接泄漏防护 max_requests_per_connection max_requests_per_connection 设置合理上限(如 1000),定期回收连接
空闲资源回收 idle_timeout idle_timeout 根据业务请求间隔设置,通常 5-30 分钟
连接健康探测 无(依赖 TCP keepalive) connection_keepalive HTTP/2 启用保活探测,检测死连接
内存控制 无(连接数间接控制) initial_connection_window_size 减小窗口大小,降低缓冲区内存占用

2.5 参数配置示例

以下是一个典型的 HTTP/2 连接池配置片段,展示了参数在 Envoy 中的实际写法:

upstream_protocol_options:
  auto_config: true
  http2_protocol_options:
    max_concurrent_streams: 200
    initial_stream_window_size: 262144        # 256KB
    initial_connection_window_size: 2097152   # 2MB
    connection_keepalive:
      interval: 30s
      timeout: 5s
      unhealthy_threshold: 3
  common_http_protocol_options:
    idle_timeout: 300s
    max_requests_per_connection: 1000
升级迁移建议:当从 HTTP/1.1 升级到 HTTP/2 时,建议先保持 max_connections: 1 并逐步增大 max_concurrent_streams,同时监控上游服务的 CPU 和内存变化。如果出现连接错误,优先检查 initial_stream_window_size 是否过小导致流控阻塞。