如何自测接口的QPS、最大吞吐量
什么是QPS
QPS = req/sec = 请求数/秒
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数>(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
上面是QPS精准的理解,当然我们也可以简单的理解为:
QPS(Query Per Second):每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
想对这些概念有进一步了解的可以参看这篇博客
吞吐量(TPS)、QPS、并发数、响应时间(RT)概念.
为什么要知道接口QPS
当我们在做B端产品时,可能并发不多,不会过多的考虑接口的性能问题,更注重的是系统的稳定性,而像面向C端的产品时,面对的流量无法预估,所以处于对系统进行保护,nginx需要设置限流策略,包括分布式系统中的接口也要有熔断降级策略,这样才能保证系统的安全性,不会在高并发的情况下崩溃。
那么问题来了,有了熔断降级、限流策略,为什么还要知道接口的QPS?
当上级要求接口的超时降级时间要求是200毫秒时,且你写的接口需要支持 100QPS,你要知道该怎么处理,计算出单个机器下接口的QPS,才能知道上线后,需要几台机器部署,而计算QPS我们可以通过jmeter等压测工具来实现。
实操
下面是自己进行压测的接口代码 内联代码片
。
@GetMapping("jmeter")
public String jmeter() {
Long begin = System.currentTimeMillis();
ReentrantLock lock = new ReentrantLock();
Map<String, Object> map = new HashMap<>();
map.put("status", 1);
try {
lock.lock();
// 执行插入操作
MsgLogV2DO msgLogV2DO = new MsgLogV2DO();
msgLogV2DO.setExchange(Thread.currentThread().getName());
msgLogV2Service.save(msgLogV2DO);
// 休眠100毫秒
TimeUnit.MILLISECONDS.sleep(100);
// 查询操作
List<MsgLogV2DO> list = msgLogV2Service.list(map);
log.error(JSON.toJSONString(list));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
Long end = System.currentTimeMillis();
if (end - begin > 200) {
throw new RuntimeException("接口超时抛出异常");
}
return msg;
}
接口比较简单,大家应该都能看懂,具体逻辑没有实际意义,目的就是保证接口有一定的耗时,这里我没有集成hystrix,通过代码来实现超过200毫秒就抛出异常。
接下来进行Jmeter压测
**关于如何使用Jemter进行压测,及设置,大家可以参考这篇文章,讲解还是挺清晰的:jmeter测试网站QPS.
通过调整jmeter压测的属性,一点点增大吞吐量,当出现异常%开始出现时,就说明此时接口已经处于不健康状态了
通过多次测试,可以知道这个接口的吞吐量应该在10/sec左右。这是本人第一篇文章,有不对的地方欢迎指正。下篇考虑写下String为什么要重写equals方法,这里面涉及的点还是很多的,有了解的朋友可以讨论下。