压测目标设定:性能基线、目标吞吐量、响应时间SLA、资源利用率上限、压测通过标准

做压测这么多年,我见过太多团队一上来就猛怼流量,结果测完一脸懵——这结果到底是好是坏?没人说得清。说白了,就是缺了目标。

没有目标的压测,就像没有靶子的射击。你打再多的子弹,也不知道自己准不准。今天我们就聊聊,怎么把压测目标定清楚。

性能基线:你的起点在哪

性能基线,就是系统当前的能力水平。我习惯叫它「体检报告」。没有基线,你根本不知道这次压测是进步了还是退步了。

举个例子。你接手一个老系统,线上TPS大概500,平均响应时间200ms。那这就是你的基线。下次压测,如果TPS到了600,响应时间降到150ms,说明优化有效。反之,如果TPS掉到400,那就要排查问题了。

基线通常包含哪些指标?

  • 平均TPS / QPS
  • 平均响应时间(Avg RT)
  • P95 / P99 响应时间
  • 错误率
  • CPU、内存、IO 等资源使用情况

我在项目中遇到过一件事。有个团队说系统性能提升了30%,我问基线是多少?他们答不上来。后来一查,原来基线数据是半年前的,中间系统架构都重构过了。你想想看,拿半年前的数据当基线,这对比还有什么意义?

我的建议:基线要定期更新。每次大版本发布后,重新跑一轮基线压测。我一般每两周更新一次,遇到重大变更随时更新。

目标吞吐量:你到底要扛多少

目标吞吐量,就是系统需要达到的处理能力。这个数字不是拍脑袋定的,得从业务需求来。

怎么算?我一般这么干:

  1. 看峰值流量——过去一年线上最高的QPS是多少?
  2. 加冗余——峰值基础上再加30%-50%的余量。为什么?因为流量会涨,系统要留点余粮。
  3. 考虑未来——如果业务预期增长,目标吞吐量也要跟着调。

举个例子。某电商系统,去年双十一峰值QPS是10000。那目标吞吐量可以定在15000。为什么?因为今年用户量涨了,活动力度也大了,得留够余量。

注意:目标吞吐量不是越高越好。定得太高,硬件成本飙升;定得太低,线上扛不住。我曾经见过一个团队,目标定到20000 QPS,结果硬件预算翻了3倍,老板直接拍桌子。后来我们重新评估,发现实际峰值只有8000,目标定到12000就足够了。

响应时间SLA:用户能等多久

响应时间SLA,就是你对用户的承诺。比如「99%的请求在200ms内返回」。这个承诺不是随便写的,得看业务场景。

我习惯把响应时间分成几个等级:

业务类型 建议SLA 说明
核心交易(下单、支付) P99 < 200ms 用户耐心最低,慢了就流失
列表查询(商品、订单) P99 < 500ms 可以接受稍慢,但不能卡死
后台报表 P99 < 3s 内部使用,容忍度较高
批量任务 P99 < 30s 异步处理,用户不感知

为什么会这样?因为用户对不同类型的请求,耐心是不一样的。你想想看,点个支付按钮等3秒,你肯定骂娘。但导出个报表等30秒,你可能觉得正常。

我曾经踩过一个坑。有个项目把SLA统一设为P99 < 200ms,结果后台报表接口天天报警。后来才发现,报表查询要扫描几百万条数据,200ms根本不可能。最后我们把报表的SLA放宽到3秒,世界清净了。

我的习惯:SLA要分接口、分场景定。核心接口严格,非核心接口宽松。别一刀切。

资源利用率上限:别把机器跑死

资源利用率上限,就是给系统划一条红线。超过这条线,系统可能出问题。常见的资源包括CPU、内存、磁盘IO、网络带宽。

我一般这么定:

  • CPU:不超过70%。为什么不是100%?因为CPU到100%时,系统已经严重卡顿了。留30%给突发流量和系统进程。
  • 内存:不超过80%。内存用满会导致OOM,进程被kill。留20%给缓存和临时对象。
  • 磁盘IO:不超过60%。磁盘IO是慢设备,超过60%后延迟会急剧上升。
  • 网络带宽:不超过50%。网络拥堵会导致丢包和重传,影响性能。

一个真实案例:有次压测,CPU跑到85%,TPS还在涨。团队觉得没问题,结果线上流量一来,CPU直接飙到100%,系统雪崩。后来我们复盘,发现85%已经是临界点了。从那以后,CPU上限我坚决定在70%。

嗯,这里要注意。资源利用率上限不是死的。如果你的机器配置高、业务模型简单,可以适当放宽。但保守一点总没错。

压测通过标准:怎么才算过

压测通过标准,就是所有目标都达标了,才能说「这次压测通过了」。我习惯用一张检查清单:

检查项 标准 说明
目标吞吐量 达到或超过设定值 比如目标15000 QPS,实际要跑到15000+
响应时间SLA P99 在阈值内 比如P99 < 200ms
错误率 < 0.1% 允许少量错误,但不能超过千分之一
资源利用率 所有指标在上限内 CPU < 70%,内存 < 80% 等
稳定性 持续运行30分钟无异常 短时间达标不算,要能稳住

我一般还会加一条:压测结束后,系统能自动恢复。什么意思?就是压测停了,CPU、内存能降回正常水平。如果降不下来,说明有内存泄漏或资源未释放的问题。

避坑指南:我曾经遇到一个项目,压测时所有指标都达标,但压测一停,CPU死活降不下来。后来查了三天,发现是一个线程池没做回收。所以通过标准里,一定要加上「恢复性检查」。

一张图看懂压测目标设定

下面这张图,把整个目标设定的逻辑串起来了。从业务需求出发,一步步推导出压测通过标准。

压测目标设定流程 业务需求 性能基线 目标吞吐量 响应时间SLA 资源利用率上限 压测通过标准 压测结论:通过 / 不通过

你看,从业务需求出发,拆解出四个核心目标。每个目标都有明确的量化标准。最后汇总成压测通过标准。这样整个流程就清晰了。

小结

压测目标设定,说白了就是回答四个问题:

  • 你现在在哪?(基线)
  • 你要去哪?(目标吞吐量)
  • 路上能堵多久?(响应时间SLA)
  • 车不能开散架了(资源利用率上限)

这四个问题都答清楚了,压测通过标准自然就出来了。我每次做压测,都会先把这些目标写下来,贴在工位上。测完了,一条条对照检查。过了就是过了,没过就找原因。简单、直接、有效。

记住,没有目标的压测,就是瞎忙活。