QPS(每秒查询数)指标

1. 什么是QPS?

QPS,全称是Queries Per Second,每秒查询数。说白了,就是你的系统在一秒钟内能处理多少个请求。我刚开始做压测时,老把QPS和TPS搞混,后来发现一个简单的区分方法:QPS侧重查询场景,TPS侧重事务场景。但在接口压测里,这两个概念经常混着用,大家心里有数就行。

核心定义:单位时间内成功处理的请求数量。注意是「成功处理」,不是「收到请求」。那些被拒绝的、超时的、返回5xx的,统统不算。

一个容易踩的坑:QPS统计的是服务端完成响应的请求,不是客户端发起的请求。如果客户端发了100个,服务端只成功处理了80个,那QPS就是80,不是100。

2. QPS的计算方式

计算公式其实很简单:

QPS = 总请求数 / 总耗时(秒)

举个例子:1秒内处理了500个请求,QPS就是500。

但在真实压测中,我更习惯用另一种方式算:

平均响应时间(RT) = 总耗时 / 成功请求数
QPS = 1000ms / 平均响应时间(ms)

举个例子,假设接口平均响应时间是20ms:

QPS = 1000 / 20 = 50

这意味着单线程每秒能处理50个请求。如果开10个线程并发,理论QPS就是500。但理想很丰满,现实很骨感,线程多了会有上下文切换开销,实际值往往低于理论值。

我个人的习惯:压测时除了看最终QPS,还会关注「响应时间分布」。比如P99响应时间突然飙升,说明系统快到瓶颈了。别等到QPS下降才叫停,那时候已经晚了。

3. 峰值QPS vs 平均QPS

这两个概念搞不清楚,压测报告基本等于白做。我见过不少新人,拿着平均QPS当系统容量上限,结果上线就被打爆。

指标 定义 计算方式 用途
平均QPS 一段时间内的平均处理能力 总请求数 / 总时长 评估系统日常负载
峰值QPS 某个瞬间的最高处理能力 1秒内的最大请求数 确定系统上限

为什么说平均QPS容易误导人?你想想看,线上流量从来不是均匀的。白天可能每分钟5000请求,凌晨可能只有500。平均下来看还行,但高峰期可能就把系统打垮了。

我曾经踩过的坑:做压测时只关注平均QPS,觉得系统能扛住。结果上线后遇到秒杀活动,3秒内流量暴涨10倍,直接打崩了。后来我才知道,系统容量评估必须看峰值QPS。

怎么确定峰值QPS?我的做法是:

  1. 先小并发压测,逐步增加线程数
  2. 记录每个线程数下的QPS
  3. 找到QPS不再增长的那个点——那就是峰值QPS
  4. 系统容量 = 峰值QPS × 0.7(安全系数)

打个比方,如果系统峰值QPS是2000,那我建议承载上限设在1400左右。留30%的缓冲空间,应对突发流量。

4. QPS与线程池配置的关系

做压测的人最常问的就是:「线程池设多大合适?」这个问题,得先搞懂QPS和线程池的关系。

核心公式是这样的:

QPS = 线程数 / 平均响应时间

从这个公式能看出两个关键点:

  • 线程数越多,QPS不一定越高。因为线程多了,CPU忙着切换上下文,真正干活的时间反而少了
  • 响应时间越短,QPS越高。哪怕线程数不变,优化代码让接口快10ms,QPS可能翻倍

我一般用这个思路来配置线程池:

场景 核心线程数 最大线程数 队列容量 说明
CPU密集型 CPU核数 + 1 CPU核数 × 2 50~100 计算操作多,线程多了反而慢
IO密集型 CPU核数 × 2 CPU核数 × 4 100~500 等待IO时线程可以切换
混合型 CPU核数 × 2 CPU核数 × 3 200~300 根据实际压测调整

但这只是参考值。真正靠谱的做法是压测验证。我通常的做法是:

  1. 从最小线程数开始(比如4个)
  2. 每次增加2个线程,记录QPS变化
  3. 找到QPS拐点——就是线程再增加,QPS不再明显增长的那个点
  4. 把核心线程数设在这个拐点附近
压测小技巧:每次调整线程池后,等系统稳定3-5分钟再记录数据。刚调整完的几秒内,线程在创建、销毁,数据会有波动,不够准确。

举个例子,我之前测过一个用户服务:

  • 4个线程时,QPS = 400
  • 8个线程时,QPS = 750
  • 12个线程时,QPS = 880
  • 16个线程时,QPS = 900
  • 20个线程时,QPS = 890(开始下降)

你看,12个线程时QPS已经接近峰值了。再多加线程,CPU忙着切换线程上下文,QPS反而降了。所以我把核心线程数设在12,最大线程数设在16作为缓冲。

QPS核心知识体系 QPS指标 定义 每秒成功处理的请求数 不包括失败请求 计算方式 QPS = 总请求数 / 总耗时 或 1000ms / 平均RT 平均QPS 日常负载评估 峰值QPS 系统容量上限 QPS = 线程数 / 平均响应时间 按CPU/IO密集型配置线程池

通过这张图,你能看到QPS不是孤立存在的。它跟定义、计算方式、平均和峰值、以及线程池配置,全串在一起。做压测时,这几块内容得一条线捋清楚,缺一个都不行。