QPS提升之路

QPS是指系统每秒能处理的外部请求数,通常用来衡量单个接口的处理能力,衡量应用处理能力的另一个标准是TPS,为每秒能处理的事务数量。

1000QPS通常是个分水岭,纯粹的单机应用很难处理这个级别,单机NoSQL QPS通常能达到万级。

这种没有任何上下文的说法是一种不准确的说法,也会有常常将并发用户数和吞吐率混淆的说法。

但有一点需要统一,不管是针对吞吐量、吞吐率、TPS的测试,都需要指明单位时间。

通常都需要指出硬件环境:

CPU性能、内存存储速度/大小、硬盘转速。

测试对象

并发数、总请求数、请求资源。

压力测试一般包括两个部分,即并发用户数和总请求数,也就是模拟多少用户同时向服务器发送多少请求。

请求性质是对请求URL所代表资源的描述,如:1KB的静态文件,1次数据库查询等,不存在一种对所有性质的请求都高效的并发策略。

衡量系统吞吐量的参数:QPS/TPS、并发数、响应时间。

测试目的

性能测试结果的意义并非侧重于它的绝对值,而是探讨如何测量性能以及如何根据不同应用场景优化性能。

并发数

并发用户数是指在同一时刻向服务器发送请求的用户总数。

100个用户同时向服务器分别执行10次请求,与1个用户向服务器连续发起1000次请求,是截然不同的效果。

任何服务器的网卡者能接受缓存区中只有1个用户的请求,而网卡接收缓冲区中有100个等待处理的用户,则服务器的压力会更大。

QPS

如果一个接口请求耗时1ms,则这个接口的QPS为1000。

每秒查询率QPS通常是针对查询服务器在规定时间内所能处理流量的标准,如:域名服务器的性能。即每秒的响应请求数。

QPS = 1000ms/RT

决定QPS关键因素RT(响应时间),包含两个优化点:(线程)等待时间和执行时间。

TPS

每秒钟系统能处理的事务或交易数量,衡量服务器对事务的处理能力。

一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此计算使用的时间和完成的事务数。

一般的,评价系统性能均以每秒钟完成的技术交易数量来衡量,系统整体处理能力取决于处理能力最低的模块TPS值。

吞吐量

在一次性能测试过程中网络上传输的数据量总和。

对于交互式应用吞吐量指标反映的是服务器能承受的压力,容量规划测试中,吞吐量是一个重点关注指标,能说明应用的负载能力。

在性能调优中吞吐量指标也有重要的参考价值,如:cpu和数据库都很快,结果应用程序处理能力很差,说明应用程序处理逻辑是系统的瓶颈。

吞吐量限制是性能瓶颈的重要表现形式,有针对性的对吞吐量进行设计测试,能快速定位到性能冰晶位置,

80% 系统的性能瓶颈是由吞吐量制约,并发用户和吞吐量瓶颈之间存在一定关联,通过不断增加并发用户数和吞吐量观察系统的性能瓶颈。从网络、数据库、应用代码以及应用服务器这些方面定系统性能瓶颈。

吞吐率

给吞吐量加个时间限定,如:1秒。

单从定义来看,吞吐率描述了服务器在运行期间单位时间内处理的请求数,然而,服务器并发处理能力上限更值得关注,也就是单位时间内服务器能处理的最大请求数,即最大吞吐率。

压力测试

通过模拟足够数量的并发用户,分别持续发送一定量的HTTP请求,并统计测试持续的总时间,计算出基于当前“压力” 下的吞吐率,即为一个平均计算值。

QPS提升

降低执行链路所用的时间,及如提高CPU利用率。

1、降低执行链路时间加入缓存最为直接,计算型处理可采用分段并行计算。

2、提高CPU利用率集中在I/O上,避免I/O阻塞导致的CPU利用率问题。

3、提升数据库性能

SEDA

SEDA思想将任务分割成相对独立的多个阶段,各阶段都有独立的一组线程执行,各阶段间使用队列进行交互。

undertow、netty高性能服务器和通信框架都采用这种设计。

Disruptor无锁设计

SEDA提高执行效率,使用交互队列出栈入栈时,免不了要使用锁机制。

Disruptor无锁设计一定程度上避开了锁竞争的问题。