一、压测基础:吞吐量、QPS、TPS、并发用户数、响应时间等核心指标定义与关系
做性能测试这么多年,我见过太多人一上来就堆机器、调参数,结果连最基本的指标都没搞清楚。说白了,你连「快」和「慢」的标准都没定好,怎么调优?今天我们就把这些基础概念掰开揉碎了讲清楚。
1.1 核心指标速览
先给个全景图。下面这张图是我自己总结的压测核心指标关系,你看一眼就能明白个大概:
嗯,这张图你得记住。它讲的是:并发用户数是压测的「输入」,而QPS/TPS、响应时间、吞吐量是压测的「输出」。它们之间互相影响,不是孤立存在的。
1.2 逐个拆解,一个都不能少
并发用户数
并发用户数,不是「在线用户数」。我见过太多人把这两个搞混了。在线用户只是登录了系统,可能正在喝茶看报表;并发用户是同时发起请求的那批人。
举个例子:一个电商系统有10万在线用户,但真正在「双11」秒杀时同时点「立即购买」的,可能只有5000人。这5000才是并发用户数。
关键点:并发用户数 = 单位时间内发起请求的用户数量。它不是越大越好,而是要看系统能扛住多少。
QPS 与 TPS
这两个经常被混用,我来说清楚。
- QPS(Queries Per Second):每秒查询数。一般用在读场景,比如搜索、列表查询。
- TPS(Transactions Per Second):每秒事务数。一个事务可能包含多个请求,比如「下单」这个事务,包含查询库存、扣减库存、生成订单、支付等多个步骤。
我在项目中遇到过这样的情况:某团队说他们的系统TPS能达到5000,结果一细问,他们测的是QPS。为什么会有这种混淆?因为很多压测工具默认把每个HTTP请求算作一个「事务」。你想想看,如果每个请求都算事务,那TPS和QPS就没区别了。但真正的业务场景里,一个事务往往包含多个请求。
我的建议:压测前先定义好「事务」的边界。比如「用户注册」这个事务,包含填写信息、提交、发送验证码、验证成功——这才算一个完整事务。别把单个接口的QPS当成TPS来汇报,容易闹笑话。
响应时间
响应时间,就是用户从发出请求到收到完整响应所花的时间。注意是「完整响应」,不是「第一个字节」。
响应时间通常看三个值:
- 平均响应时间:所有请求的平均值。容易被极端值拉偏。
- TP95 / TP99:95%或99%的请求都在这个时间内完成。这个更有参考价值。
- 最大响应时间:最慢的那个请求。偶尔出现一次不用太在意,但如果持续偏高,说明有问题。
我曾经帮一个金融客户调优,他们只看平均响应时间,觉得50ms挺快。结果我一看TP99,好家伙,直接飙到2秒。为什么?因为有个慢查询拖了后腿,平均一下看起来还行,但实际用户体验很差。
注意:不要只看平均值!平均值会骗人。重点关注TP95和TP99,它们才是用户真实体感的反映。
吞吐量
吞吐量,说白了就是系统在单位时间内能处理多少请求或数据量。单位可以是:
- 请求数/秒(与QPS类似,但更宽泛)
- 字节数/秒(比如文件上传场景)
- 业务量/小时(比如订单数/小时)
吞吐量和QPS的关系,有点像「总产量」和「单位产量」。QPS是每秒能处理多少查询,吞吐量是整体能处理多少。在压测报告里,我习惯把吞吐量作为宏观指标,QPS/TPS作为微观指标。
1.3 它们之间的关系,一张表说清楚
| 指标 | 定义 | 典型单位 | 与并发用户数的关系 |
|---|---|---|---|
| 并发用户数 | 同时发起请求的用户数量 | 个 | — |
| QPS | 每秒查询数(读场景) | 次/秒 | 并发用户数 ↑ → QPS ↑(线性增长,直到瓶颈) |
| TPS | 每秒事务数(写/混合场景) | 个/秒 | 并发用户数 ↑ → TPS ↑(受事务复杂度影响) |
| 响应时间 | 请求发出到收到完整响应的时间 | 毫秒(ms) | 并发用户数 ↑ → 响应时间 ↑(非线性增长) |
| 吞吐量 | 单位时间内处理的请求/数据总量 | 请求/秒 或 MB/秒 | 并发用户数 ↑ → 吞吐量 ↑(达到上限后下降) |
这里有个经典公式,我建议你刻在脑子里:
并发用户数 = QPS × 平均响应时间(秒)
举个例子:如果QPS是1000,平均响应时间是200ms(0.2秒),那么并发用户数 = 1000 × 0.2 = 200。也就是说,200个并发用户就能让系统达到1000 QPS。
反过来,如果你知道并发用户数是500,平均响应时间是300ms,那QPS = 500 / 0.3 ≈ 1667。这个公式在压测规划时特别有用。
1.4 避坑指南:我踩过的那些坑
做压测这么多年,我总结了几条血泪教训:
- 别把「并发」等同于「多线程」。我曾经见过一个团队,用1000个线程发请求,以为就是1000并发。结果每个线程发完一个请求就等响应,实际同时发请求的只有几十个。真正的并发,是同一时刻发出去的请求数。
- 响应时间要分阶段看。网络延迟、排队等待、服务处理、数据库查询——每一段都可能成为瓶颈。我习惯在压测时加上链路追踪,看看时间到底花在哪。
- 吞吐量不是越高越好。当吞吐量接近系统上限时,响应时间会急剧恶化。你想想看,如果为了多处理10%的请求,响应时间从200ms飙到2秒,用户早就跑了。
一句话总结:压测不是比谁的数字大,而是找到系统在「可接受响应时间」下的「最大吞吐量」。这才是性能调优的真正目标。
好了,这一章的基础概念就讲到这里。记住这些指标和它们的关系,后面的调优实战才能有的放矢。