
这期拆解 Java 后端面试里常见的 QPS 与性能瓶颈追问:怎么限定场景、怎么说压测边界、看哪些监控指标,以及如何把「系统能扛多少」答成可信的项目经历。
我不会单独报一个「最高 QPS」。我会先限定场景,比如登录、查询、下单这类接口的请求链路不同。我们看吞吐量时会同时看响应时间、错误率和资源饱和情况。之前做过的做法是:先用压测工具模拟稳定流量和阶梯流量,再接入服务端监控,看 CPU、线程池、数据库连接池、缓存命中率和慢查询。最后得到的结论不是「系统能扛 X」,而是「在某个场景、某个数据量、某个错误率约束下,系统稳定在 X 左右,主要瓶颈在 Y」。
| 词 | 面试里该怎么说 | 不要怎么说 |
|---|---|---|
| QPS / 吞吐量 | 单位时间内处理的请求量。JMeter 文档把 throughput 定义为 requests/unit of time,并给出「请求数 / 总时间」的计算方式。Apache JMeter Glossary | 「QPS 越高越好」,但不说错误率和响应时间 |
| 响应时间 / 延迟 | JMeter 把 elapsed time 记为从发送请求前到最后响应收到后的时间,latency 记为从发送请求前到收到第一个响应后的时间。Apache JMeter Glossary | 只说平均 RT,不看 P95、P99 |
| 流量 / traffic | Google SRE 书把 traffic 作为四个黄金信号之一,对 Web 服务来说通常可用每秒 HTTP 请求数衡量。1 | 把「并发用户数」直接等同于 QPS |
| 饱和度 / saturation | Google SRE 书把 saturation 解释为系统有多「满」,并提醒很多系统在达到 100% 利用率之前就会变慢。1 | CPU 没到 100%,就断定系统没有瓶颈 |
如果是商品详情查询,我会关注缓存命中率、Redis 和数据库读压力、P95 响应时间。如果是下单链路,我不会只看 QPS,还会看库存扣减、订单写入、消息发送和支付回调是否出现错误或堆积。
我这个项目里最核心的是订单查询接口。我们先按业务入口拆了几类请求:订单列表、订单详情、物流状态。压测时没有只打一个固定订单号,而是准备了不同用户、不同订单状态的数据,避免缓存把结果抹平。指标上我主要看 QPS、P95、错误率、应用线程池、数据库连接池和慢查询。压到某个阶段后,QPS 不再增长,P95 开始上升,但 CPU 还没打满。继续看监控发现数据库连接池等待变长,慢查询集中在订单列表的状态筛选。后面做了索引调整和查询条件收敛,再复测,瓶颈从数据库等待转移到了应用线程池队列。这个结果说明我们不是单纯「加机器」解决,而是先确认瓶颈在哪里。
我没有在生产项目里主导过完整压测,所以不会直接说项目能扛多少 QPS。但我会这样分析:先按业务链路估算峰值请求,比如用户数、活跃比例、核心接口访问频次;再用 JMeter 或类似工具做接口层压测;同时接入服务端监控,至少看 QPS、P95、错误率、CPU、内存、数据库连接数和慢查询。真正回答「瓶颈在哪里」时,要看压测过程中哪个指标先异常,而不是凭感觉说数据库或 Redis。
这个要限定接口和成功标准。以订单查询为例,在测试环境、某批数据、错误率和 P95 约束下,我们测到的是某个范围。这个范围不能直接等同于生产容量,因为生产环境的数据量、机器规格、外部依赖和流量分布不同。我更愿意把它说成「在这些条件下的稳定吞吐」,而不是系统整体上限。
如果瓶颈在无状态应用层,加机器通常有效;如果瓶颈在数据库锁、连接池、慢查询、热点缓存或外部接口,加应用机器可能只会把压力更快打到下游。所以我会先看饱和资源在哪里,再决定是扩容、缓存、限流、异步化,还是改 SQL 和索引。
不一定。平均值会掩盖长尾请求。我会同时看 P95、P99 和错误率。比如大多数请求很快,但少量请求卡在数据库锁或第三方接口上,平均值可能还行,用户却会明显感到卡顿。
优化前后要保持压测条件一致。比如同样的数据集、同样的并发模型、同样的机器规格,比较 QPS、P95、错误率和关键资源指标。只看一次跑分不够,至少要看指标变化方向和瓶颈是否转移。
prometheus.io
jmeter.apache.org
docs.aws.amazon.com
jmeter.apache.org
brendangregg.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.