3. 容量水位核心指标定义:CPU、内存、磁盘、网络IO、连接数、QPS、P99延迟、错误率

在集群升级过程中,服务目录平台(Service Catalog Platform)的容量水位巡检是保障业务连续性的关键防线。容量水位并非单一维度的“资源使用率”,而是由基础设施层、中间件层和业务层三层指标构成的立体监控体系。本章将逐一拆解8项核心指标的定义、采集粒度、阈值基线及异常判定逻辑。

巡检原则:所有指标必须同时关注“稳态值”与“变化率”。升级期间,即使值未超阈值,若指标在短时间内(如5分钟内)斜率陡增,也应视为潜在风险。

3.1 指标全景与分层映射

下表展示了8项核心指标在服务目录平台中的分层归属、典型采集工具及默认巡检周期。理解分层关系有助于在异常时快速定位故障域。

指标名称 所属层级 典型采集源 默认巡检周期 升级期间建议周期
CPU 使用率 基础设施层 node_exporter / cAdvisor 60s 15s
内存使用率 基础设施层 node_exporter / cAdvisor 60s 15s
磁盘使用率 & IO 基础设施层 node_exporter / 云监控 60s 30s
网络 IO 基础设施层 node_exporter / 云监控 60s 30s
连接数 中间件层 MySQL / Redis / Nginx status 30s 10s
QPS 业务层 API Gateway / 应用埋点 10s 5s
P99 延迟 业务层 APM (SkyWalking / Jaeger) 10s 5s
错误率 业务层 API Gateway / 应用日志 10s 5s
关键认知:升级期间,业务层指标(QPS、P99延迟、错误率)的优先级高于基础设施层指标。即使CPU/内存正常,只要P99延迟飙升或错误率>0,就必须暂停升级并回滚。

3.2 基础设施层指标详解

3.2.1 CPU 使用率

  • 定义:CPU 处于非空闲状态的时间百分比。在 Kubernetes 环境中,需区分 node_cpu_seconds_total(节点级)与 container_cpu_usage_seconds_total(容器级)。
  • 阈值基线:日常稳态 < 70%;升级期间警戒线 < 85%;超过 90% 触发熔断。
  • 异常模式:CPU 使用率突然从 40% 跳变至 80% 并持续抖动,通常表明有新的计算密集型进程(如数据迁移、镜像解压)在竞争资源。

3.2.2 内存使用率

  • 定义:已用内存(含 Buffer/Cache)占总内存的百分比。重点关注 container_memory_working_set_bytes,该指标排除了缓存页,更能反映真实压力。
  • 阈值基线:日常稳态 < 75%;升级期间警戒线 < 85%;超过 90% 可能触发 OOM Kill。
  • 异常模式:内存使用率缓慢爬升且不回落(内存泄漏特征),或升级后瞬间飙升(新版本 JVM 堆配置不当)。

3.2.3 磁盘使用率 & IO

  • 定义:磁盘使用率指已用空间占比;磁盘 IO 关注 iowait 和 disk_io_time_seconds_total。
  • 阈值基线:磁盘使用率 < 80%(预留 20% 给日志和临时文件);iowait < 10%。
  • 异常模式:升级过程中大量日志写入或镜像层解压导致 IO 打满,表现为 iowait 持续 > 30%,应用响应变慢。

3.2.4 网络 IO

  • 定义:网络接口的入/出流量速率(bytes/sec)及丢包率。使用 node_network_receive_bytes_total 和 node_network_transmit_bytes_total 的 rate 值。
  • 阈值基线:带宽使用率 < 60%;丢包率 = 0。
  • 异常模式:升级期间镜像拉取或数据同步导致带宽打满,引发其他服务的网络超时重传。
基础设施层容量水位巡检流程 基础设施层容量水位巡检流程 节点/容器指标采集 CPU 使用率 内存使用率 磁盘 & IO 网络 IO 阈值判定 CPU<85% 内存<85% 磁盘<80% 丢包=0 异常告警 暂停升级 说明:采集层每15s上报一次数据,阈值判定模块同时检查值与变化率(5min斜率)。

3.3 中间件层指标详解

3.3.1 连接数

  • 定义:当前建立的 TCP 连接数或数据库连接池活跃连接数。对于 MySQL,关注 Threads_connected;对于 Redis,关注 connected_clients。
  • 阈值基线:连接数使用率(当前连接数/最大连接数)< 70%;升级期间 < 80%。
  • 异常模式:升级过程中应用重启导致大量旧连接未释放(TIME_WAIT 堆积),或新版本连接池配置过大,瞬间打满数据库连接上限。

3.4 业务层指标详解

3.4.1 QPS(每秒查询数)

  • 定义:服务目录平台每秒处理的请求数量。通常按 API 维度聚合,如 catalog_api_requests_total 的 rate 值。
  • 阈值基线:日常峰值 QPS 的 80% 作为警戒线;升级期间若 QPS 突然下降超过 50%,可能表明服务异常或流量被错误路由。
  • 异常模式:QPS 陡降(服务不可用)或陡升(流量重试风暴)。

3.4.2 P99 延迟

  • 定义:99% 的请求在多少毫秒内完成。这是衡量用户体验的核心指标,通常使用 APM 工具通过采样计算。
  • 阈值基线:日常 P99 < 200ms;升级期间 < 500ms;超过 1s 视为严重事件。
  • 异常模式:P99 延迟从 150ms 跳变至 800ms,即使平均值正常,也说明存在长尾请求,可能是数据库慢查询或网络抖动。

3.4.3 错误率

  • 定义:返回 HTTP 5xx 或业务错误码的请求占总请求数的比例。使用 sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) 计算。
  • 阈值基线:日常 < 0.1%;升级期间 < 0.5%;任何非零错误率持续超过 1 分钟即触发回滚。
  • 异常模式:错误率从 0% 瞬间升至 5% 以上,通常由 API 版本不兼容、配置错误或依赖服务不可用导致。
业务层指标异常检测与决策流程 业务层指标异常检测与决策流程 业务指标输入 QPS 变化率 P99 延迟 错误率 综合判定 QPS 降 >50% P99 >500ms 错误率 >0.5% 触发回滚 立即执行 说明:业务层指标采用“一票否决”制——只要错误率>0.5%或P99>1s,无论基础设施指标是否正常,均触发回滚。 QPS 变化率需结合历史基线判断,避免因业务低峰期误报。

3.5 指标关联分析与巡检策略

单一指标异常往往只是表象,真正的根因需要通过指标间的关联分析来定位。以下是几种常见的关联模式:

现象 可能关联指标 根因推测 建议动作
P99 延迟升高 + 错误率不变 CPU / 磁盘 IO / 连接数 资源竞争或慢查询 检查慢 SQL、扩容 CPU
错误率升高 + QPS 下降 连接数 / 网络 IO 服务不可用或连接池耗尽 检查服务健康、重启连接池
CPU 飙升 + 内存平稳 QPS / P99 计算密集型任务或死循环 抓取线程栈、分析热点
磁盘使用率缓慢增长 + IO 正常 日志量 / 数据量 日志轮转失效或数据积压 清理日志、检查定时任务
升级巡检铁律:在升级窗口内,必须同时观察“当前值”与“变化趋势”。例如,CPU 从 30% 升至 60% 可能仍在阈值内,但若 5 分钟内斜率 > 5%/min,则需提前介入。建议使用 PromQL 的 deriv() 函数计算变化率。

3.6 指标采集与告警配置示例

以下是一个基于 Prometheus + Alertmanager 的告警规则片段,覆盖了本章定义的 8 项核心指标。实际部署时需根据服务目录平台的规模调整阈值。

groups:
  - name: catalog_capacity_alerts
    rules:
      # 基础设施层
      - alert: HighCPUUsage
        expr: (100 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 2m
        labels: { severity: critical }
        annotations: { summary: "CPU 使用率超过 85%" }

      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 2m
        labels: { severity: critical }
        annotations: { summary: "内存使用率超过 85%" }

      - alert: HighDiskUsage
        expr: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100 > 80
        for: 5m
        labels: { severity: warning }
        annotations: { summary: "磁盘使用率超过 80%" }

      - alert: HighDiskIO
        expr: rate(node_disk_io_time_seconds_total[5m]) > 0.3
        for: 2m
        labels: { severity: warning }
        annotations: { summary: "磁盘 IO 等待时间过高" }

      - alert: HighNetworkDrop
        expr: rate(node_network_receive_drop_total[5m]) > 0 or rate(node_network_transmit_drop_total[5m]) > 0
        for: 1m
        labels: { severity: critical }
        annotations: { summary: "网络丢包率不为 0" }

      # 中间件层
      - alert: HighConnectionCount
        expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 80
        for: 1m
        labels: { severity: critical }
        annotations: { summary: "MySQL 连接数使用率超过 80%" }

      # 业务层
      - alert: HighP99Latency
        expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 0.5
        for: 1m
        labels: { severity: critical }
        annotations: { summary: "P99 延迟超过 500ms" }

      - alert: HighErrorRate
        expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.005
        for: 1m
        labels: { severity: critical }
        annotations: { summary: "错误率超过 0.5%" }
实践建议:升级期间,建议将 Alertmanager 的 repeat_interval 缩短至 5 分钟,并将告警通知渠道设置为即时通讯工具(如钉钉/飞书机器人),确保值班人员能在 1 分钟内响应。