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:每个连接同一时刻只能处理一个请求。并发请求数 = 连接数。连接耗尽时新请求进入等待队列。
- 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 是否过小导致流控阻塞。