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 小时甚至更久)。目的是发现内存泄漏、连接池耗尽、资源回收不及时等长期运行才会暴露的问题。
容量压测类型与核心指标关系图 容量压测类型与核心指标关系 容量压测 负载测试 验证预期负载下的性能 压力测试 寻找系统极限与拐点 稳定性测试 长时间运行发现泄漏 QPS / TPS RT (P95/P99) 错误率 资源利用率 说明:三种压测类型均需关注所有核心指标,但侧重点不同。负载测试关注 QPS/TPS 是否达标;压力测试关注 RT 和错误率的拐点;稳定性测试关注资源利用率随时间的变化趋势。

2.4 压测类型对比

下表从多个维度对比三种压测类型,帮助你在实际项目中做出选择:

对比维度 负载测试 压力测试 稳定性测试
主要目的 验证预期性能 寻找极限与瓶颈 验证长期可靠性
负载模型 平稳或阶梯递增至预期峰值 持续递增直至系统崩溃 恒定负载(峰值 70%-80%)
持续时间 短(10-30 分钟) 中(30-60 分钟) 长(4-24 小时)
关注指标 QPS/TPS、RT、错误率 RT 拐点、错误率拐点、最大 QPS 内存趋势、连接池状态、GC 频率
CI/CD 门禁场景 每次提交后的快速验证 大版本发布前的极限验证 预发布环境的长时间验证
平台工程实践建议: 在 CI/CD 流水线中,建议将负载测试作为“快速门禁”集成到每次合并请求中;将压力测试和稳定性测试作为“深度门禁”集成到夜间构建或预发布阶段。
压测类型与 CI/CD 流水线集成流程 压测类型与 CI/CD 流水线集成流程 代码提交 快速门禁 负载测试 深度门禁 压力+稳定性测试 生产发布 失败:回滚 失败:阻塞发布 说明:在 CI/CD 流水线中,负载测试作为快速门禁在每次提交时执行,确保基础性能不退化。 压力测试和稳定性测试作为深度门禁在预发布阶段执行,确保系统在极限和长时间运行下的可靠性。

2.5 压测流程概览

一个标准的容量压测流程通常包含以下步骤:

  1. 需求分析: 明确压测目标(如支持 1000 QPS)、确定核心场景(如用户登录、商品搜索、下单支付)。
  2. 脚本开发: 使用压测工具(如 JMeter、Locust、k6)编写模拟用户行为的脚本。
  3. 环境准备: 部署与被压测环境一致的测试环境,确保网络、中间件、数据库等配置与生产对齐。
  4. 执行压测: 按照预设的负载模型执行测试,并实时监控系统指标。
  5. 结果分析: 分析 QPS、RT、错误率、资源利用率等指标,定位瓶颈。
  6. 优化与回归: 针对瓶颈进行优化(如代码优化、配置调优、扩容),并重新执行压测验证。
平台工程自动化: 上述流程中的步骤 2-6 应尽可能自动化。例如,压测脚本随代码一起版本管理,压测环境通过 IaC(基础设施即代码)自动拉起,压测结果自动生成报告并关联到 CI/CD 门禁。