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 驱逐或扩容。
巡检要点: 当连接池进入阶段 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 巡检系统应建立从指标采集到调度动作的闭环。
生产实践: 在蚂蚁集团、字节跳动的 Kubernetes 集群中,连接池水位指标已作为 自定义调度器插件 的输入。调度器在分配 Pod 时,会优先选择节点上已有 Pod 连接池空闲数较多的节点,避免将新 Pod 调度到连接池已拥挤的节点上,从而减少“热点 Pod”现象。