3. Envoy HTTP/2 连接管理:连接池配置、最大并发流、初始窗口大小、连接保活
在多租户场景下,Envoy 与上游服务之间的 HTTP/2 连接管理直接决定了资源隔离的粒度与故障扩散的边界。本章深入剖析连接池、最大并发流、初始窗口大小与连接保活四个核心参数,并结合租户隔离需求给出调优策略。
3.1 连接池配置与租户隔离
Envoy 为每个上游集群维护独立的 HTTP/2 连接池。连接池的核心参数决定了单个租户能占用的连接资源上限,以及连接复用的效率。
| 参数 | 默认值 | 租户隔离调优建议 |
|---|---|---|
max_requests_per_connection |
无限制 (0) | 建议设为 1000~5000,防止单连接无限增长导致内存泄漏 |
max_connection_count |
无限制 (0) | 按租户配额设置,例如 10~50,避免单租户耗尽连接池 |
connect_timeout |
5s | 租户敏感场景可缩短至 1~2s,快速失败避免队列堆积 |
idle_timeout |
1h | 建议 5~15min,平衡连接复用与资源释放 |
租户隔离实践: 为每个租户创建独立的上游集群(Cluster),并在集群级别设置
max_connection_count。配合 circuit_breakers 中的 max_connections 和 max_pending_requests,形成双层限流。
# 示例:租户A的集群连接池配置
clusters:
- name: tenant_a_cluster
connect_timeout: 2s
per_connection_buffer_limit_bytes: 1048576 # 1MB
http2_protocol_options:
max_concurrent_streams: 100
initial_stream_window_size: 65535
initial_connection_window_size: 1048576
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 50
max_pending_requests: 100
max_requests: 200
max_retries: 3
3.2 最大并发流(Max Concurrent Streams)
HTTP/2 在一个连接上支持多路复用流(Stream)。max_concurrent_streams 参数控制单个连接上允许同时存在的活跃流数量。Envoy 作为客户端向上游发起请求时,该参数由上游服务通过 SETTINGS 帧告知;Envoy 作为服务端时,可通过 http2_protocol_options.max_concurrent_streams 主动设置。
- 默认值: 100(Envoy 作为服务端时)
- 过小的影响: 并发请求被阻塞,增加排队延迟,降低吞吐
- 过大的影响: 单连接承载过多流,导致内存压力、流控复杂度上升,一个慢请求可能阻塞其他流
租户隔离风险: 如果所有租户共享同一个上游连接,某个租户突发大量请求会占满并发流上限,导致其他租户请求被排队或拒绝。必须为每个租户分配独立连接池,并设置合理的
max_concurrent_streams。
3.3 初始窗口大小(Initial Window Size)
HTTP/2 流控基于窗口更新(WINDOW_UPDATE)机制。初始窗口大小决定了在收到 WINDOW_UPDATE 之前,发送方可以发送的最大数据量。Envoy 提供两个关键参数:
| 参数 | 作用域 | 默认值 | 调优建议 |
|---|---|---|---|
initial_stream_window_size |
单个流 | 65535 (64KB) | 提升至 1MB~4MB,减少流控等待 |
initial_connection_window_size |
整个连接 | 65535 (64KB) | 提升至 10MB~100MB,匹配高吞吐场景 |
调优原则:
- 流窗口应小于连接窗口,避免单流独占带宽
- 租户隔离场景下,连接窗口不宜过大,防止单租户缓存过多数据
- 配合
stream_idle_timeout防止慢流长期占用窗口
# 调优示例:提升窗口大小减少流控延迟
http2_protocol_options:
initial_stream_window_size: 1048576 # 1MB
initial_connection_window_size: 10485760 # 10MB
max_concurrent_streams: 200
3.4 连接保活(Keepalive)
HTTP/2 连接保活通过 PING 帧实现。Envoy 支持两种保活机制:
- 上游连接保活: Envoy 定期向上游发送 PING 帧,检测连接健康状态
- 下游连接保活: 客户端与 Envoy 之间的保活,由客户端驱动
| 参数 | 默认值 | 说明 |
|---|---|---|
connection_keepalive.interval |
30s | PING 发送间隔 |
connection_keepalive.timeout |
15s | 等待 PING 响应的超时时间 |
connection_keepalive.interval_jitter |
0.1 | 抖动系数,防止惊群效应 |
租户隔离中的保活策略: 对于低流量租户,可适当增大保活间隔(如 60s)并缩短空闲超时(idle_timeout),避免长期占用连接资源。对于高流量租户,保活间隔可缩短至 10s,确保连接快速故障检测。
3.5 连接管理流程与参数协同
下图展示了 Envoy HTTP/2 连接从建立到关闭的全生命周期,以及各参数的作用位置:
3.6 参数调优矩阵与租户等级映射
根据租户的 SLA 等级,推荐以下参数配置模板:
| 租户等级 | max_concurrent_streams | initial_stream_window_size | initial_connection_window_size | idle_timeout | 保活间隔 |
|---|---|---|---|---|---|
| 金级 | 200 | 4MB | 100MB | 30min | 10s |
| 银级 | 100 | 1MB | 10MB | 15min | 30s |
| 铜级 | 50 | 256KB | 5MB | 5min | 60s |
调优验证: 使用 Envoy 的
/stats 端点监控 upstream_cx_active、upstream_rq_active、upstream_cx_destroy_local_with_active_rq 等指标,确认参数调整后连接复用率提升、流控等待减少。