4. 容量水位指标体系:CPU水位、内存水位、IO水位、网络水位、应用层水位

容量水位指标是混沌工程验证的“度量标尺”。没有统一、可量化的水位口径,混沌实验就失去了判断系统是否健康的基准。本章定义五大核心水位维度及其关键指标,并给出混沌实验中的水位阈值参考。

4.1 五大水位维度总览

容量水位从底层硬件到上层业务,分为五个相互关联的维度。任何单一维度的过载都可能引发级联故障。

维度 核心关注点 典型混沌实验场景 水位突变特征
CPU水位 计算资源饱和度、排队长度 CPU压力注入、计算密集型任务抢占 瞬时飙升、持续高负载、上下文切换陡增
内存水位 内存使用率、换页、OOM风险 内存泄漏模拟、堆内存压力测试 GC频率上升、Swap使用率增长、OOM Killer触发
IO水位 磁盘吞吐、IOPS、延迟 磁盘IO限速、文件系统故障注入 IO等待时间延长、队列深度堆积、读写延迟抖动
网络水位 带宽、连接数、丢包、延迟 网络延迟注入、带宽限制、丢包模拟 重传率上升、连接超时、TCP窗口缩小
应用层水位 QPS、RT、错误率、饱和度 流量突增、依赖服务降级、熔断触发 请求排队、超时比例增加、限流触发、熔断打开
水位口径原则: 混沌实验的“爆炸半径”必须与水位指标联动。例如,CPU水位达到80%时触发限流,实验设计应验证该阈值是否准确,而非盲目压垮系统。

4.2 CPU水位指标与口径

CPU水位反映计算资源的饱和程度。在混沌工程中,CPU水位是衡量“计算资源争抢”对系统影响的核心指标。

  • 核心指标:
    • cpu.utilization:CPU使用率(百分比),推荐取1分钟平均。
    • cpu.load.avg1/5/15:系统平均负载,需结合CPU核数判断。
    • cpu.context_switches:上下文切换次数/秒,过高说明锁竞争或线程过多。
    • cpu.run_queue:运行队列长度,持续大于CPU核数×2表示过载。
  • 混沌实验水位阈值参考:
    • 安全水位:cpu.utilization < 60%
    • 警戒水位:cpu.utilization 60% ~ 80%
    • 危险水位:cpu.utilization > 80%,且run_queue持续增长

4.3 内存水位指标与口径

内存水位直接关联应用稳定性。内存泄漏或突发大对象分配是混沌实验的常见故障模式。

  • 核心指标:
    • mem.used_percent:内存使用率(不含缓存/缓冲区)。
    • mem.swap.used_percent:Swap使用率,非零即需关注。
    • mem.oom_kills:OOM Killer触发次数,任何非零值均为严重事件。
    • jvm.heap.used_percent:JVM堆内存使用率(Java应用)。
    • jvm.gc.time:GC暂停时间,Full GC时间超过1秒需告警。
  • 混沌实验水位阈值参考:
    • 安全水位:mem.used_percent < 70%,且无Swap使用
    • 警戒水位:mem.used_percent 70% ~ 85%,或Swap开始使用
    • 危险水位:mem.used_percent > 85%,或出现OOM事件

4.4 IO水位指标与口径

IO水位是存储子系统的健康度度量。磁盘IO瓶颈常表现为“系统负载高但CPU空闲”。

  • 核心指标:
    • io.util:磁盘IO利用率(百分比),接近100%表示磁盘饱和。
    • io.await:IO请求平均等待时间(毫秒),SSD通常<2ms,HDD<10ms。
    • io.svctm:IO服务时间,反映磁盘硬件性能。
    • io.queue_depth:IO请求队列深度,持续升高说明磁盘处理不过来。
  • 混沌实验水位阈值参考:
    • 安全水位:io.util < 60%,io.await < 5ms
    • 警戒水位:io.util 60% ~ 80%,io.await 5ms ~ 20ms
    • 危险水位:io.util > 80%,io.await > 20ms,或队列深度持续增长

4.5 网络水位指标与口径

网络水位影响分布式系统的通信质量。混沌实验常通过延迟、丢包、带宽限制来模拟网络故障。

  • 核心指标:
    • net.bandwidth.usage:带宽使用率(百分比),接近100%可能丢包。
    • net.tcp.retransmit:TCP重传率,超过1%表示网络质量下降。
    • net.latency:网络往返延迟(RTT),微服务间通常<1ms。
    • net.connection.count:连接数,接近系统上限时新连接会失败。
  • 混沌实验水位阈值参考:
    • 安全水位:带宽使用率 < 50%,重传率 < 0.1%
    • 警戒水位:带宽使用率 50% ~ 80%,重传率 0.1% ~ 1%
    • 危险水位:带宽使用率 > 80%,重传率 > 1%,或连接数达到上限

4.6 应用层水位指标与口径

应用层水位是业务视角的容量度量,直接反映用户体验。混沌实验的最终验证目标就是应用层水位是否在预期范围内。

  • 核心指标:
    • app.qps:每秒请求数,需与容量规划目标对比。
    • app.rt.p99:99分位响应时间,超过500ms通常需要关注。
    • app.error_rate:错误率(5xx/4xx),超过1%需告警。
    • app.saturation:应用饱和度(如线程池使用率、连接池使用率),超过80%可能触发限流。
  • 混沌实验水位阈值参考:
    • 安全水位:error_rate < 0.1%,rt.p99 < 200ms,饱和度 < 60%
    • 警戒水位:error_rate 0.1% ~ 1%,rt.p99 200ms ~ 500ms,饱和度 60% ~ 80%
    • 危险水位:error_rate > 1%,rt.p99 > 500ms,饱和度 > 80%
重要: 应用层水位是“结果指标”,CPU/内存/IO/网络水位是“原因指标”。混沌实验应同时观测因果指标,才能准确判断故障根因。例如,网络延迟升高(原因)导致应用RT增加(结果),若只监控应用层可能误判为代码性能问题。

4.7 五维水位联动关系图

下图展示五大水位维度之间的典型故障传导路径,帮助设计混沌实验时确定注入点和观测点。

五维水位联动关系图 CPU水位 内存水位 IO水位 网络水位 应用层水位 计算资源争抢 OOM/GC抖动 IO等待阻塞 延迟/丢包 内存不足→CPU等待 内存换页→IO压力 IO等待→网络超时 混沌实验设计要点: 注入底层故障(CPU/内存/IO/网络)时,必须同时观测应用层水位变化,验证限流、降级、熔断等容错机制是否按预期生效。

4.8 混沌实验水位指标采集配置示例

以下是一个基于Prometheus的指标采集配置片段,覆盖五大水位维度的核心指标。混沌实验平台可通过此配置自动采集水位数据。

# prometheus.yml 水位指标采集配置片段
scrape_configs:
  - job_name: 'node_exporter'  # 系统水位
    static_configs:
      - targets: ['localhost:9100']
    metrics:
      - node_cpu_seconds_total
      - node_memory_MemTotal_bytes
      - node_memory_MemAvailable_bytes
      - node_disk_io_time_seconds_total
      - node_network_receive_bytes_total
      - node_network_transmit_bytes_total

  - job_name: 'jvm_exporter'   # JVM内存水位
    static_configs:
      - targets: ['localhost:12345']
    metrics:
      - jvm_memory_bytes_used{area="heap"}
      - jvm_gc_collection_seconds_sum

  - job_name: 'app_metrics'    # 应用层水位
    static_configs:
      - targets: ['localhost:8080']
    metrics:
      - app_requests_total
      - app_request_duration_seconds
      - app_errors_total
      - app_thread_pool_active_count
水位口径最佳实践:
  • 统一命名规范: 所有水位指标遵循 {维度}_{指标名} 格式,如 cpu_utilization、mem_used_percent。
  • 多维度聚合: 混沌实验的“通过/失败”判定应基于多个水位指标的组合,而非单一指标。例如,CPU高+RT高+错误率低,可能只是计算密集任务,而非故障。
  • 水位基线: 在混沌实验前,先采集10分钟以上的水位基线数据,用于对比实验中的水位偏移量。