4. 连接池水位指标:活跃连接数、空闲连接数、等待队列长度、连接超时率、连接错误率

连接池是微服务与中间件(数据库、缓存、gRPC 上游)之间的核心资源层。在 Kubernetes 节点上,每个 Pod 实例持有的连接池状态直接决定了请求能否被及时处理。本章定义五个关键水位指标,并给出采集口径与异常判定标准。

4.1 指标全景与采集口径

下表列出五个指标的定义、典型采集位置以及推荐阈值(以 Java Tomcat JDBC 连接池为例,其他语言/中间件可类比映射)。

指标名称 定义 采集来源 正常水位 告警水位
活跃连接数 当前正在被线程持有、执行 SQL/RPC 调用的连接数量 连接池 JMX / 客户端统计 ≤ 池最大容量 × 70% ≥ 池最大容量 × 90%
空闲连接数 已建立但未被使用的连接数量 连接池 JMX / 客户端统计 ≥ 池最大容量 × 10% ≤ 池最大容量 × 5%
等待队列长度 因无空闲连接而阻塞等待的请求数 连接池内部队列计数器 0 > 0 持续 5s
连接超时率 单位时间内获取连接超时的次数 / 总获取请求次数 客户端超时异常计数 < 0.1% ≥ 1%
连接错误率 单位时间内连接建立失败、连接断开、协议错误的次数 / 总请求次数 客户端异常计数 < 0.05% ≥ 0.5%
采集建议: 在 Kubernetes 环境下,优先通过 Prometheus 客户端暴露连接池指标(如 hikaricp_active_connections、tomcat_connectionpool_active),避免依赖 SSH 到 Pod 内执行 jstack 或 telnet。指标 label 应包含 namespace、pod、container、db_instance 四个维度,便于后续关联 Pod 调度决策。

4.2 连接池水位状态机

下图展示连接池从健康到过载的四个阶段,以及每个阶段对应的指标特征。SRE 巡检时应根据当前阶段决定是否触发 Pod 驱逐或扩容。

连接池水位状态机 阶段 1:健康 活跃 < 70% 等待队列 = 0 阶段 2:拥挤 活跃 70% ~ 90% 空闲 < 10% 阶段 3:过载 活跃 ≥ 90% 等待队列 > 0 阶段 4:故障 超时率 ≥ 1% 错误率 ≥ 0.5% 空闲耗尽 请求堆积 超时/错误持续恶化 Pod 重启 / 扩容
巡检要点: 当连接池进入阶段 2(拥挤)时,SRE 应开始关注 Pod 所在节点的 CPU/内存余量,并评估是否需要提前扩容 HPA 副本数。阶段 3(过载)必须触发告警,阶段 4(故障)应自动执行 Pod 优雅驱逐(kubectl drain 或调整 preStop hook)。

4.3 等待队列长度:最敏感的先行指标

在五个指标中,等待队列长度 是连接池即将崩溃的最早信号。当活跃连接数尚未达到上限时,如果等待队列开始出现非零值,说明连接获取速度已低于请求到达速度。

  • 正常值: 始终为 0,表示所有请求都能立即获得连接。
  • 临界值: 等待队列 > 0 且持续超过 3 秒,表明连接池已无缓冲能力。
  • 危险值: 等待队列长度持续增长(如每秒 +10),说明后端数据库或上游服务响应变慢,连接归还速率下降。
避坑指南: 不要只监控活跃连接数百分比。在连接池最大容量设置过大(如 200)的场景下,活跃数 150(75%)可能看起来正常,但若数据库最大连接数只有 100,实际已触发数据库端拒绝连接。务必同时采集 数据库端实际连接数 进行对比。

4.4 连接超时率与连接错误率的联合分析

这两个指标经常被混淆,但它们的根因和修复手段完全不同:

对比维度 连接超时率 连接错误率
典型异常 ConnectionTimeoutException CommunicationsException、SocketException
根因 连接池无可用连接,请求在客户端等待超时 网络闪断、数据库重启、认证失败、协议版本不匹配
修复方向 增大连接池上限、优化 SQL 执行时间、扩容 Pod 检查网络策略、数据库健康、连接字符串配置
对调度影响 触发 Pod 水平扩容或迁移到资源更充足的节点 触发 Pod 重建(restartPolicy: Always)或节点排水

在巡检脚本中,建议将两个指标组合为一个 连接健康度 评分:

# 连接健康度评分公式(0~100)
connection_health_score = 100
  - (active_ratio * 30)           # 活跃占比权重 30
  - (wait_queue_length * 10)      # 等待队列每 1 个扣 10 分
  - (timeout_rate * 2000)         # 超时率每 1% 扣 20 分
  - (error_rate * 4000)           # 错误率每 1% 扣 40 分

# 评分区间
# 90~100:健康
# 70~89: 拥挤,需关注
# 50~69: 过载,触发告警
# < 50:  故障,自动介入

4.5 连接池水位与 Pod 调度的映射关系

下图展示连接池水位指标如何驱动 Kubernetes 调度决策。SRE 巡检系统应建立从指标采集到调度动作的闭环。

连接池水位 → Pod 调度决策映射 指标输入层 • 活跃连接数 • 空闲连接数 • 等待队列长度 • 连接超时率 • 连接错误率 + 节点资源水位 + 数据库端连接数 调度决策引擎 水位评分 < 70 → 标记 Pod 为 "连接池高水位" 触发 descheduler 或 HPA 扩容 调度动作层 1. HPA 扩容副本 2. Pod 迁移至 低负载节点 3. 调整连接池 最大容量 4. 优雅驱逐 (kubectl drain) 5. 数据库连接池 扩容或限流
生产实践: 在蚂蚁集团、字节跳动的 Kubernetes 集群中,连接池水位指标已作为 自定义调度器插件 的输入。调度器在分配 Pod 时,会优先选择节点上已有 Pod 连接池空闲数较多的节点,避免将新 Pod 调度到连接池已拥挤的节点上,从而减少“热点 Pod”现象。