QPS、TPS、RT 之间关系
问题
开发过程中,不免会遇到评价系统性能的指标,如:QPS 和 TPS 都是“每秒多少次”,到底有什么区别?这几个概念容易产生混淆,在此梳理一下
一、 基础定义
首先,我们明确三者的定义
QPS
(Queries Per Second):每秒查询数,通常用于描述系统对请求的处理能力(如接口调用次数)。TPS
(Transactions Per Second):每秒事务数,通常用于事务性系统(如支付、下单),一个事务可能包含多个请求。对于简单查询:TPS ≈ QPSRT
(Response Time):响应时间,指从请求发出到响应完成的耗时(一般取平均值或 P95、P99)。
可以用一个公式来直观感受:·QPS×RT≈并发数
这就是著名的 Little 定律(利特尔法则)的简化形式。我们也可看出:
- TPS 是更高层的业务指标,QPS 是更底层的技术指标;
- RT 直接影响 QPS 和 TPS 的实际表现。
二、场景示例
假设我们有一个电商系统:
- 用户请求下单接口 /order。
- 每次下单请求需要经过 库存检查 → 创建订单 → 扣减库存 → 支付调用。
- 我们规定:
- 1个事务 (Transaction) = 完成一次下单操作;
- 1个事务包含 3 个请求 (Request)(比如:查询库存、写订单、支付)。
在这个过程中:
- QPS 表示每秒钟处理多少个“接口请求”(如库存查询、订单写入);
- TPS 表示每秒钟完成多少个“完整事务”(下单成功次数);
- RT 表示每个请求的响应时间(平均耗时)。
三、模拟示例
我们写一个简单的压测程序,模拟并发请求,并统计 QPS、TPS 和 RT。
public class QPSDemo {// 模拟请求总数private static final int TOTAL_REQUESTS = 1000;// 模拟并发线程数private static final int THREAD_COUNT = 20;public static void main(String[] args) throws InterruptedException {ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);CountDownLatch latch = new CountDownLatch(TOTAL_REQUESTS);AtomicLong totalRt = new AtomicLong(0); // 请求总耗时AtomicLong requestCount = new AtomicLong(0); // 请求总数AtomicLong transactionCount = new AtomicLong(0); // 事务总数long startTime = System.currentTimeMillis();for (int i = 0; i < TOTAL_REQUESTS; i++) {executor.submit(() -> {long rtStart = System.currentTimeMillis();try {// 模拟一个事务包含3个请求for (int j = 0; j < 3; j++) {simulateBusinessLogic(j);requestCount.incrementAndGet(); // 每个请求计数}transactionCount.incrementAndGet(); // 每个事务完成一次} catch (Exception e) {e.printStackTrace();} finally {long rtEnd = System.currentTimeMillis();totalRt.addAndGet(rtEnd - rtStart);latch.countDown();}});}latch.await();long endTime = System.currentTimeMillis();long totalTime = endTime - startTime; // 总耗时double qps = requestCount.get() / (totalTime / 1000.0);double tps = transactionCount.get() / (totalTime / 1000.0);double avgRt = totalRt.get() * 1.0 / transactionCount.get();System.out.println("==== 性能指标结果 ====");System.out.println("请求总数 (Request): " + requestCount.get());System.out.println("事务总数 (Transaction): " + transactionCount.get());System.out.println("总耗时: " + totalTime + " ms");System.out.println("QPS: " + qps);System.out.println("TPS: " + tps);System.out.println("平均RT (每事务): " + avgRt + " ms");executor.shutdown();}// 模拟业务逻辑,每个请求大约耗时100msprivate static void simulateBusinessLogic(int step) throws InterruptedException {switch (step) {case 0: // 库存检查Thread.sleep(80);break;case 1: // 写订单Thread.sleep(100);break;case 2: // 调用支付Thread.sleep(120);break;default:Thread.sleep(50);}}
}
代码说明
- 模拟事务与请求映射关系:1个事务=3个请求,所以请求数≈事务数*3。
- QPS 计算:请求数 / 总耗时(s)。
- TPS 计算:事务数/总耗时(s)。
- RT 计算:所有请求耗时总和 / 请求数。
四、总结
总结来说:
- QPS反映系统的技术吞吐能力;
- TPS反映系统的业务处理能力;
- RT反映系统对用户的响应体验;
三者相互制约,是性能优化和容量规划的核心参考指标。在性能调优或压测中,应同时关注这三者,通过控制并发数、优化请求耗时和合理限流,才能在吞吐量和响应速度之间找到最佳平衡。