2. 容量压测基础
2.1 什么是容量压测
容量压测(Capacity Load Testing)是一种通过模拟真实用户流量,对系统施加预期或超预期的并发负载,从而评估系统在特定容量下的性能表现、稳定性和资源消耗的测试方法。其核心目标是回答三个问题:
- 系统能承受多少并发用户? —— 找到系统的最大承载能力。
- 在极限负载下,系统表现如何? —— 验证响应时间、错误率是否在可接受范围内。
- 系统何时会崩溃? —— 发现性能拐点和瓶颈。
平台工程视角: 容量压测不是一次性的活动,而是应作为 CI/CD 流水线中的“压测门禁”,每次代码变更后自动执行,防止性能劣化进入生产环境。
2.2 压测核心指标
理解以下五个核心指标是进行容量压测和结果分析的基础:
| 指标 | 全称 | 定义 | 典型关注值 |
|---|---|---|---|
| QPS | Queries Per Second | 每秒查询数,通常用于衡量读密集型系统(如搜索引擎、数据库)的吞吐能力。 | 根据业务规模,从几百到几十万不等 |
| TPS | Transactions Per Second | 每秒事务数,通常用于衡量写密集型或复杂业务系统(如订单、支付)的吞吐能力。一个事务可能包含多个请求。 | 根据业务规模,从几十到几万不等 |
| RT | Response Time | 响应时间,从发送请求到收到完整响应所经过的时间。通常关注平均值(Avg)、95分位值(P95)、99分位值(P99)。 | P99 < 200ms(高要求),P99 < 1s(一般要求) |
| 错误率 | Error Rate | 失败请求数占总请求数的百分比。包括 HTTP 5xx、超时、业务逻辑异常等。 | < 0.1%(严格),< 1%(宽松) |
| 资源利用率 | Resource Utilization | 系统资源(CPU、内存、磁盘 I/O、网络带宽)的使用百分比。用于判断系统是否达到瓶颈。 | CPU < 80%,内存 < 85% |
常见误区: 不要只关注平均响应时间。P99 分位值更能反映系统在极端情况下的体验。例如,平均 RT 为 50ms,但 P99 可能高达 2s,这意味着 1% 的用户体验极差。
2.3 压测类型
根据测试目的不同,容量压测通常分为以下三种类型:
- 负载测试(Load Testing): 模拟预期的正常业务负载,验证系统在典型压力下的性能表现。目的是确保系统能够平稳处理日常流量。
- 压力测试(Stress Testing): 持续增加负载,直到系统达到极限或崩溃。目的是找到系统的性能拐点和最大承载能力,以及系统在过载时的行为(如优雅降级、限流、熔断)。
- 稳定性测试(Stability Testing / Soak Testing): 在一定的负载水平下(通常是峰值的 70%-80%),长时间运行(如 4-8 小时甚至更久)。目的是发现内存泄漏、连接池耗尽、资源回收不及时等长期运行才会暴露的问题。
2.4 压测类型对比
下表从多个维度对比三种压测类型,帮助你在实际项目中做出选择:
| 对比维度 | 负载测试 | 压力测试 | 稳定性测试 |
|---|---|---|---|
| 主要目的 | 验证预期性能 | 寻找极限与瓶颈 | 验证长期可靠性 |
| 负载模型 | 平稳或阶梯递增至预期峰值 | 持续递增直至系统崩溃 | 恒定负载(峰值 70%-80%) |
| 持续时间 | 短(10-30 分钟) | 中(30-60 分钟) | 长(4-24 小时) |
| 关注指标 | QPS/TPS、RT、错误率 | RT 拐点、错误率拐点、最大 QPS | 内存趋势、连接池状态、GC 频率 |
| CI/CD 门禁场景 | 每次提交后的快速验证 | 大版本发布前的极限验证 | 预发布环境的长时间验证 |
平台工程实践建议: 在 CI/CD 流水线中,建议将负载测试作为“快速门禁”集成到每次合并请求中;将压力测试和稳定性测试作为“深度门禁”集成到夜间构建或预发布阶段。
2.5 压测流程概览
一个标准的容量压测流程通常包含以下步骤:
- 需求分析: 明确压测目标(如支持 1000 QPS)、确定核心场景(如用户登录、商品搜索、下单支付)。
- 脚本开发: 使用压测工具(如 JMeter、Locust、k6)编写模拟用户行为的脚本。
- 环境准备: 部署与被压测环境一致的测试环境,确保网络、中间件、数据库等配置与生产对齐。
- 执行压测: 按照预设的负载模型执行测试,并实时监控系统指标。
- 结果分析: 分析 QPS、RT、错误率、资源利用率等指标,定位瓶颈。
- 优化与回归: 针对瓶颈进行优化(如代码优化、配置调优、扩容),并重新执行压测验证。
平台工程自动化: 上述流程中的步骤 2-6 应尽可能自动化。例如,压测脚本随代码一起版本管理,压测环境通过 IaC(基础设施即代码)自动拉起,压测结果自动生成报告并关联到 CI/CD 门禁。