别再用 QPS 计算并发数了!我曾经也犯了这个错误
别再用 QPS 计算并发数了!我曾经也犯了这个错误
✍️ 前言:一次“压测误区”的反思
在一次压测计划中,我想要模拟系统在 QPS 为 500 的情况下运行一分钟,于是直接算了下:
500 QPS × 60 秒 = 30,000 请求
我很自然地把这个数当成“发起请求的总数”,在压测工具里配置成了对应的并发请求和速率。
可实际执行后,结果完全不对劲:服务器很快就吃不消,响应成功数远低于预期,日志也开始大量报错。
后来我才意识到,原来我混淆了 QPS 的含义。
压测工具配置的是发起请求数(RPS),而我想要的是成功处理数(QPS)。
这之间的误解,足以让一次压测结果严重失真。
📌 QPS、RPS、TPS 到底有啥区别?
| 概念 | 全称 | 关注点 | 说明 |
|---|---|---|---|
| QPS | Queries Per Second | 服务端处理能力 | 每秒成功响应的请求数 |
| RPS | Requests Per Second | 客户端施压能力 | 每秒发起的请求数,不一定全部处理成功 |
| TPS | Transactions Per Second | 事务处理能力 | 每秒完成的事务数量(如数据库事务) |
🎯 举个例子说明问题
假设某系统在 1 秒内:
- 接收了 100 个请求(RPS = 100)
- 实际只处理了其中的 80 个(QPS = 80)
这就说明当前服务已经出现了处理瓶颈。RPS 代表了你希望系统处理的压力,QPS 则代表系统真正扛下的能力。
所以,在系统性能评估中:
- RPS 越高,意味着你施加的压力量越大
- QPS 越高,意味着系统的处理能力越强
🛠 在压测工具中如何体现?
以我们常用的 JMeter 和 Locust 为例:
✅ JMeter
- 设置线程数和循环次数,模拟的是 RPS
- 报表中统计的“每秒成功响应数”是 QPS
✅ Locust
- 可以直接设置“每秒发起请求数”,即 RPS
- 后台 UI 中的统计图表会展示 QPS 的变化趋势
也就是说,在压测工具中我们通常设置的是 RPS,而观察的结果才是 QPS。
如果你错误地用 QPS 作为设置参数,就会导致实际发起请求数远大于系统处理能力,从而产生误判。
❌ 我的错误做法回顾
我曾以为:
QPS 就是我要每秒发出的请求数,所以直接用它去设定并发和速率。
但事实是:
- 压测工具设置的是 RPS;
- QPS 是结果,由系统的处理能力决定,不能直接“配置”出来。
所以我的测试其实是在用 RPS = 500 压系统,而不是“系统能稳定处理 500 请求”的验证。
结果当然就是,系统很快打满,响应超时、失败率飙升,QPS 也远达不到预期。
✅ 正确的理解方式是:
- QPS 是观测值:测试过程中系统每秒实际处理完成的请求数量;
- RPS 是输入参数:我们对系统施加的压力量;
因此如果你的目标是“系统达到 QPS = 500”,你应该:
- 配置合理的 RPS 值;
- 逐步加压;
- 观察 QPS 是否随之提升;
- 评估在什么点系统开始失控或无法线性提升处理能力。
💡 我的实践建议
- 目标明确:先明确你的压测目标是测客户端发压能力(RPS)还是服务端承压能力(QPS);
- 逐步施压:用阶梯式压测或线性提升 RPS 的方式,逐步逼近系统极限;
- 实时观测:通过 APM 工具、日志、Prometheus 或压测工具自身统计,实时观测 QPS、失败率、响应时间等核心指标;
- 聚焦瓶颈点:一旦 QPS 不再随 RPS 增加,就要开始分析:是 CPU?数据库?网络?线程池?找出系统的限速器。
🧩 总结一句话
QPS 是系统抗压的“结果”,RPS 是你施加的“压力”——两者混淆只会让压测失真。
🎯 最后的提醒
如果你正在做接口压测,请务必检查以下问题:
- 你配置的是 RPS 还是 QPS?
- 你设定的目标,是系统性能的结果,还是工具的输入?
- 你是否用对了这些指标的含义?
我已经踩过一次坑了,如果你刚好也走到了这一步,希望这篇文章能帮你少走一点弯路。
版权所有,转载请注明出处。
评论









