2. 压力测试基础:什么是压力测试?关键指标(TPS、响应时间、错误率、资源利用率)

2.1 什么是压力测试?

压力测试(Stress Testing)是性能测试的一种,通过逐步增加系统负载,观察系统在超出正常预期负载时的行为表现。其核心目标是找到系统的极限拐点,验证系统在极端条件下的稳定性与恢复能力。

核心定义:压力测试 ≠ 负载测试。负载测试关注“正常峰值”下的响应,压力测试关注“超出峰值”后的行为,包括降级策略、错误恢复和资源瓶颈。

压力测试通常回答以下三个问题:

  • 极限在哪里?——系统在崩溃前能承受的最大并发用户数或TPS。
  • 如何崩溃?——是优雅降级、部分请求失败,还是完全无响应?
  • 恢复能力?——压力释放后,系统能否自动恢复到正常状态?

2.2 压力测试的四大关键指标

压力测试的结果必须通过量化指标来评估。以下四个指标构成压力测试的核心度量体系,缺一不可。

指标 定义 压力测试中的意义 常见阈值参考
TPS Transactions Per Second,系统每秒处理的事务数 衡量系统吞吐能力,压力测试中观察TPS是否随负载线性增长,出现拐点即表示瓶颈 根据业务基线,通常期望TPS拐点不低于设计目标的120%
响应时间 从发送请求到收到完整响应所消耗的时间(通常取95分位或99分位) 压力下响应时间会急剧上升,是判断系统是否“健康”的敏感指标 压力场景下,95分位响应时间不应超过基线的3倍
错误率 失败请求数占总请求数的百分比 压力测试中允许一定比例的错误,但需明确错误类型(超时、拒绝连接、业务异常) 通常要求错误率 < 1%,极限压力下可接受 < 5%
资源利用率 CPU、内存、磁盘I/O、网络带宽的使用百分比 定位瓶颈层(计算密集型、内存泄漏、I/O阻塞),判断资源是否均衡 CPU < 80%,内存 < 85%,磁盘队列长度 < 2
实战提示:不要单独看某个指标。例如TPS很高但响应时间从50ms飙升到5000ms,说明系统正在用“排队”换取吞吐,用户体验极差。必须四个指标联合分析。

2.3 压力测试的典型流程

一次完整的压力测试通常包含以下步骤:

  1. 确定压力目标:明确要测试的业务场景(如“双11秒杀”),设定目标TPS和并发数。
  2. 构建压力模型:基于用户行为比例,设计请求分布(读/写比例、思考时间等)。
  3. 阶梯式加压:从低负载开始,逐步增加并发用户或TPS,每个阶梯持续1-2分钟。
  4. 监控与采集:同步记录TPS、响应时间、错误率、服务器资源。
  5. 识别拐点:当TPS不再随负载增加而上升,或响应时间出现“膝盖曲线”,即为极限点。
  6. 分析瓶颈:结合资源利用率,定位是CPU、数据库连接池、线程池还是网络带宽。
  7. 恢复验证:停止压力后,观察系统是否自动恢复,是否存在内存泄漏或连接未释放。

2.4 压力测试中的“拐点”分析

压力测试最核心的产出是拐点图。下图展示了TPS与响应时间在压力下的典型关系:

压力测试拐点分析示意图 TPS / 响应时间 并发用户数 TPS 响应时间 拐点区域 TPS停止增长,响应时间飙升 正常区 饱和区 崩溃区 TPS 响应时间 拐点
常见误区:很多测试人员只关注TPS是否达标,忽略了响应时间在拐点后的“悬崖式”增长。一个健康的系统应该在接近极限时仍然保持响应时间的可控增长,而不是突然崩溃。

2.5 资源利用率与瓶颈定位

当压力测试出现性能瓶颈时,资源利用率指标可以帮助快速定位问题层:

资源指标 异常表现 可能瓶颈 典型排查方向
CPU 利用率 > 90% TPS 增长缓慢,响应时间上升 计算密集型瓶颈 检查是否有复杂算法、频繁GC、死循环
内存利用率持续上升 GC 频繁,响应时间抖动 内存泄漏或堆配置不足 使用 heap dump 分析对象引用链
磁盘 I/O 等待 > 50% TPS 波动大,部分请求超时 磁盘读写瓶颈 检查慢查询、日志写入频率、磁盘类型(SSD vs HDD)
网络带宽打满 请求排队,连接超时 带宽不足或数据包过大 压缩响应体、减少不必要的数据传输

2.6 压力测试的“黄金法则”

  • 先单点,后混合:先对单个接口做压力测试,再混合多个业务场景。
  • 预热不可少:正式压测前先运行1-2分钟低负载,让JIT编译、连接池初始化完成。
  • 持续时长要足够:至少持续5-10分钟,才能暴露内存泄漏、连接泄漏等慢性问题。
  • 监控要全面:不仅监控应用服务器,还要监控数据库、缓存、消息队列等中间件。
  • 结果可复现:每次压测的环境配置、数据量、压力模型必须记录,确保对比有效。
数据驱动决策要点:压力测试不是为了“通过”而做,而是为了获取数据来指导容量规划、代码优化和架构升级。每次压测后,必须输出“极限TPS、拐点并发数、瓶颈资源”三个关键数据,作为后续A/B测试的基线。