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