3. Envoy 连接池与缓存:HTTP连接池原理、连接复用与空闲超时、连接池耗尽导致的缓存未命中
3.1 HTTP 连接池核心原理
Envoy 为每个上游集群维护独立的 HTTP 连接池。连接池的核心目标是复用 TCP 连接,减少因频繁建立和关闭连接带来的延迟与资源开销。Envoy 的连接池分为 HTTP/1.1 和 HTTP/2 两种模式,其行为差异显著。
| 特性 | HTTP/1.1 连接池 | HTTP/2 连接池 |
|---|---|---|
| 复用粒度 | 连接级(一个连接同一时刻只能处理一个请求) | 流级(一个连接可并发处理多个请求) |
| 最大连接数 | 由 max_requests_per_connection 和 max_connections 共同控制 |
由 max_connections 控制,但通常远小于 HTTP/1.1 |
| 空闲连接 | 等待新请求复用,受空闲超时控制 | 保持打开,等待新流复用 |
| 耗尽表现 | 所有连接均被占用,新请求排队或直接失败 | 达到最大并发流限制,新请求排队 |
关键指标: 连接池的“命中”是指请求能够复用池中已有的连接,无需新建 TCP 连接。缓存未命中往往与连接池耗尽导致的排队或新建连接延迟有关。
3.2 连接复用与空闲超时机制
Envoy 通过以下参数控制连接的生命周期,直接影响复用效率:
- 连接空闲超时(
idle_timeout):连接在空闲状态下保持打开的最长时间。超时后连接会被关闭,释放资源。默认值通常为 1 小时,但在高动态环境中建议缩短。 - 最大请求数(
max_requests_per_connection):HTTP/1.1 连接在关闭前能处理的最大请求数。达到上限后连接会被优雅关闭,防止连接泄漏。 - 连接生存期(
max_connection_duration):连接从建立到强制关闭的最大时长,即使连接仍在活跃使用。
当空闲超时设置过短时,连接池中的连接会被频繁回收,导致后续请求必须新建连接,增加延迟并可能触发缓存未命中。反之,超时过长会占用上游资源。
3.3 连接池耗尽导致缓存未命中的故障链路
当连接池耗尽时,Envoy 的行为会直接影响缓存命中率。典型故障链路如下:
- 突发流量涌入:大量请求同时到达,连接池中的连接被迅速占满。
- 排队与超时:新请求进入等待队列,若队列满或等待超时,Envoy 返回 503 或触发重试。
- 新建连接风暴:排队请求触发新建连接,导致上游负载激增,延迟进一步恶化。
- 缓存未命中:由于请求延迟增加,缓存键的 TTL 可能过期,或请求被直接丢弃,导致缓存层无法提供服务。
常见误区: 缓存未命中不一定是缓存层的问题。连接池耗尽导致的请求排队或超时,会使客户端感知到“缓存未命中”,即使缓存层本身健康。排查时应优先检查 Envoy 连接池指标。
3.4 关键排查指标与配置建议
| Envoy 指标 | 含义 | 异常阈值 |
|---|---|---|
cluster.upstream_cx_active |
当前活跃连接数 | 接近 max_connections 时告警 |
cluster.upstream_rq_pending_active |
当前排队请求数 | > 0 持续 10 秒以上 |
cluster.upstream_cx_idle_timeout |
空闲超时触发次数 | 突增表明超时设置过短 |
cluster.upstream_cx_destroy_local |
本地主动关闭连接数 | 与空闲超时关联分析 |
优化建议:
• 将
• 对 HTTP/1.1 集群,适当提高
• 启用
• 将
idle_timeout 设置为 5-10 分钟,平衡资源占用与复用效率。• 对 HTTP/1.1 集群,适当提高
max_connections 和 max_requests_per_connection。• 启用
circuit_breakers 防止连接池完全耗尽导致雪崩。
3.5 连接池耗尽与缓存未命中的关联分析
以下场景展示了连接池耗尽如何间接导致缓存未命中:
- 场景 A:缓存层连接池耗尽 — Envoy 到缓存上游的连接池满,请求排队,缓存查询延迟增加,导致客户端重试或超时,最终表现为缓存未命中。
- 场景 B:应用层连接池耗尽 — 应用服务器连接池耗尽,Envoy 返回 503,缓存层未收到查询请求,缓存命中率下降。
- 场景 C:空闲超时过短 — 连接频繁关闭,新建连接增加,缓存查询延迟上升,TLS 握手时间超过缓存 TTL,导致缓存未命中。
3.6 配置示例:优化连接池参数
static_resources:
clusters:
- name: cache_cluster
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
# HTTP/1.1 连接池配置
max_connections: 100
max_requests_per_connection: 500
# 空闲超时:5分钟
idle_timeout: 300s
# 连接生存期:30分钟
max_connection_duration: 1800s
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 100
max_pending_requests: 1000
max_requests: 5000
max_retries: 3
upstream_connection_options:
tcp_keepalive:
keepalive_time: 30
keepalive_interval: 10
keepalive_probes: 3
配置要点:
•
•
•
•
idle_timeout 设置为 300 秒,避免连接过早关闭。•
circuit_breakers 限制最大连接数和排队数,防止雪崩。•
tcp_keepalive 确保连接在空闲时不被中间设备断开。