3. 压力测试基础:定义、区别与关键指标
压力测试是性能工程中最高风险、最具挑战性的环节。本章从定义出发,厘清压力测试与负载测试的本质区别,并建立一套可量化的关键性能指标(KPI)体系,为后续 Champion Challenger 实验设计打下基础。
3.1 压力测试定义
压力测试(Stress Testing)是指通过持续增加系统负载,使其超过正常容量上限,观察系统在极限或异常条件下的行为、恢复能力和故障模式。其核心目标不是验证系统“能处理多少用户”,而是回答三个问题:
- 系统何时崩溃? — 找到容量拐点(Breakpoint)。
- 崩溃后如何表现? — 优雅降级、部分可用还是完全宕机。
- 恢复速度与完整性? — 压力释放后能否自动恢复至正常状态。
关键认知: 压力测试不是为了证明系统“好”,而是为了暴露系统“在什么条件下会坏、坏到什么程度、能否自愈”。Champion Challenger 实验中,压力测试结果直接决定哪个模型在极端场景下更可靠。
3.2 负载测试 vs 压力测试:核心区别
两者常被混淆,但目标、方法和结果判读完全不同。下表从六个维度进行对比:
| 对比维度 | 负载测试 | 压力测试 |
|---|---|---|
| 核心目标 | 验证系统在预期负载下的性能表现 | 探索系统在超载下的极限与故障行为 |
| 负载范围 | 0 ~ 预期峰值(通常 80%~120%) | 预期峰值 ~ 崩溃点(通常 120%~300%+) |
| 关注指标 | 响应时间、吞吐量、资源利用率 | 错误率、恢复时间、降级模式、数据一致性 |
| 期望结果 | 所有指标在 SLA 范围内 | 明确崩溃点、降级策略有效、可自动恢复 |
| 测试频率 | 每次发布前、容量规划时 | 重大架构变更、混沌工程、季度稳定性评估 |
| 风险等级 | 低(可控负载) | 高(可能引发生产级故障) |
实践建议: 在 Champion Challenger 实验中,先用负载测试筛选出“正常条件下性能合格的候选模型”,再用压力测试选出“极端条件下最稳健的冠军模型”。两个阶段不可互换。
3.3 关键性能指标(KPI)体系
压力测试需要一套多维度的 KPI 来量化系统行为。以下是最核心的六类指标:
- 吞吐量(Throughput) — 单位时间内完成的请求数(TPS/QPS)。压力测试中关注“峰值吞吐量”和“崩溃前最大吞吐量”。
- 响应时间(Response Time) — 包括平均、P50、P95、P99。压力测试更关注 P99 和 P999 在超载时的退化曲线。
- 错误率(Error Rate) — HTTP 5xx、超时、连接拒绝的比例。压力测试中错误率从 0% 跳变到 100% 的点即为崩溃点。
- 资源利用率(Resource Utilization) — CPU、内存、磁盘 I/O、网络带宽。压力测试关注哪个资源最先成为瓶颈。
- 恢复时间(Recovery Time) — 从压力释放到系统恢复正常服务的时间。Champion Challenger 中恢复时间短的模型胜出。
- 降级幅度(Degradation Ratio) — 超载时功能可用率或性能下降的比例。例如:搜索功能降级为只读模式。
常见误区: 只关注平均响应时间而忽略 P99 和错误率。压力测试中,平均响应时间可能仍在 SLA 内,但 P99 已飙升 10 倍,错误率已超过 5%。必须使用多分位指标组合判断。
3.4 压力测试 KPI 关系图
下图展示了压力测试中负载递增时各 KPI 的典型变化趋势:
3.5 压力测试流程与 Champion Challenger 结合点
在 Champion Challenger 框架中,压力测试按以下步骤执行:
- 基线建立 — 对当前生产模型(Champion)执行压力测试,记录所有 KPI 基线值。
- 候选模型加载 — 对 Challenger 模型执行相同压力测试脚本,保持负载模型一致。
- 多维度对比 — 使用 3.3 节中的六类 KPI 进行逐项对比,生成差异矩阵。
- 崩溃点排序 — 按“崩溃点负载值”从高到低排序,崩溃点最高的模型获得最高权重。
- 恢复能力评分 — 测量每个模型在压力释放后的恢复时间,恢复时间最短的模型加分。
- 综合决策 — 结合负载测试结果和压力测试结果,选出最终 Champion。
Champion Challenger 关键规则: 如果 Challenger 在负载测试中性能优于 Champion 10% 以上,但在压力测试中崩溃点低于 Champion 20% 以上,则 Challenger 不能晋升。压力测试结果具有一票否决权。
3.6 压力测试 KPI 对比矩阵示例
以下是一个 Champion vs Challenger 压力测试结果对比表示例:
| KPI 指标 | Champion(当前生产) | Challenger A | Challenger B | 判定标准 |
|---|---|---|---|---|
| 崩溃点(并发用户) | 5,200 | 6,800 | 4,500 | 越高越好 |
| 崩溃时 P99 响应时间 | 12,000 ms | 8,500 ms | 15,200 ms | 越低越好 |
| 恢复时间(秒) | 45 s | 22 s | 78 s | 越低越好 |
| 降级幅度(功能可用率) | 60% | 85% | 40% | 越高越好 |
| 资源瓶颈类型 | CPU | 内存 | 磁盘 I/O | 可扩展性评估 |
分析结论: Challenger A 在所有压力测试 KPI 上均优于 Champion,且崩溃点高出 30%,恢复时间缩短 51%,是理想的晋升候选。Challenger B 崩溃点低于 Champion,且恢复时间过长,应被淘汰。
3.7 压力测试 KPI 雷达图
下图使用雷达图直观对比 Champion 与 Challenger 在五个核心压力测试维度上的表现:
3.8 压力测试常见陷阱与避坑指南
- 陷阱一:负载递增速度过快 — 导致系统来不及触发限流/降级机制,直接崩溃。应使用阶梯式递增(每步保持 30~60 秒稳定期)。
- 陷阱二:忽略冷启动效应 — 首次压力测试时缓存未预热,结果不可代表稳态。应执行 2~3 轮预热后再记录数据。
- 陷阱三:只测一个维度 — 仅增加并发用户数而不增加数据量或请求复杂度。压力测试应同时放大“用户数”和“数据规模”。
- 陷阱四:恢复时间测量不准确 — 压力释放后立即检查健康检查接口,但业务线程池可能仍在排队。应等待所有积压请求处理完毕后再判定恢复。
- 陷阱五:忽略资源竞争 — 压力测试环境中其他进程(监控 Agent、日志采集)可能干扰结果。应使用专用环境或容器隔离。
Champion Challenger 特别提醒: 如果两个模型在压力测试中崩溃点接近(差异 < 5%),必须进一步对比“崩溃后的行为模式”——是优雅降级还是直接 503?是部分用户可用还是全局不可用?这些定性差异往往决定最终选择。