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 支持两种保活机制:

  1. 上游连接保活: Envoy 定期向上游发送 PING 帧,检测连接健康状态
  2. 下游连接保活: 客户端与 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 连接从建立到关闭的全生命周期,以及各参数的作用位置:

Envoy HTTP/2 连接生命周期与参数协同 1. 连接建立 connect_timeout 2. SETTINGS协商 max_concurrent_streams 3. 流复用 max_requests_per_connection 4. 流控管理 initial_stream_window_size 5. 保活检测 connection_keepalive 6. 空闲超时 idle_timeout 参数协同要点: • connect_timeout 控制连接建立阶段,过短导致频繁重连,过长阻塞请求 • max_concurrent_streams 与 initial_stream_window_size 共同决定单连接吞吐 • idle_timeout 应大于保活间隔,避免正常保活期间连接被误关闭 • 租户隔离场景:每个租户独立连接池,参数按租户等级差异化配置 • 故障域控制:max_connection_count + circuit_breakers 防止单租户雪崩

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 等指标,确认参数调整后连接复用率提升、流控等待减少。