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 五维水位联动关系图
下图展示五大水位维度之间的典型故障传导路径,帮助设计混沌实验时确定注入点和观测点。
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分钟以上的水位基线数据,用于对比实验中的水位偏移量。