QPS,每秒查询
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。注意这里的查询是指用户发出请求到服务器做出响应成功的次数,简单理解可以认为查询=请求request。所以:QPS = 每秒的请求量
TPS,每秒事务
Transactions Per Second 的缩写,每秒处理的事务数。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
针对单接口而言,TPS可以认为是等价于QPS的,比如访问一个页面/index.html,是一个TPS,而访问/index.html页面可能请求了3次服务器比如css、js、index接口,产生了3个QPS。
tps=每秒钟事务数量
RT,响应时间
RT(Response-time)响应时间:执行一个请求从开始到最后收到响应数据所花费的总体时间,即从客户端发起请求到收到服务器响应结果的时间。一般取平均响应时间。
Load(系统负载)
linux服务器上执行top或uptime命令,即可看到服务器端Load。
top命令示例
top - 14:33:45 up 279 days, 3:30, 1 user, load average: 0.00, 0.03, 0.05
Tasks: 191 total, 2 running, 189 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 5944432 total, 1414544 free, 3402840 used, 1127048 buff/cache
KiB Swap: 5242876 total, 4302588 free, 940288 used. 2233924 avail Mem
uptime示例
14:51:22 up 279 days, 3:47, 1 user, load average: 0.02, 0.04, 0.05
load average后面的3个数就是第1分钟、5分钟、15分钟的平均Load。load average 的值越低,系统负荷越小。示例中我们的系统负载就很低。1或大于1表示满负荷甚至超负荷,如果持续飙高那说明负载有问题了。
一般情况下,当系统负荷持续大于0.7的时候可能就需要我们重视了。
并发数
系统能同时处理的请求的数量。例如,请求一个index.html 页面,客户端发起了三个请求(css、js、index接口),那么此时TPS =1 、QPS =3 、并发数 3。
QPS = 并发数 / RT,所以: 并发数 = QPS * RT
吞吐量
每秒承受的用户访问量,吞吐量(系统能承受多少压力)和当前请求对CPU消耗、内存、IO使用等等紧密相关。单个请求消耗越高,系统吞吐量越低,反之越高。
TPS 、QPS、并发数,每个系统针对这些值都有一个相对极限值,只要其中某一个达到最大,系统的吞吐量也就到达极限了。
PV
页面访问次数:Page View
UV
访客数(去重复):Unique Visitor
服务器数量推算
按二八定律来看,如果每天 80% 的访问集中在 20% 的时间里,这 20% 的时间就叫做峰值时间。
峰值时间段每秒QPS = ( 总PV数 * 80% ) / ( 每天秒数 * 20% )
峰值时间每秒QPS / 单台机器的QPS = 需要的机器
假设每天300w PV 的在单台机器上,这台机器需要多少QPS?
( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
如果一台机器的QPS是58,需要几台机器来支持?
139 / 58 = 3
单线程QPS
单线程QPS = 1000ms/RT
我们知道一台服务器可以执行多个线程,这意味着
单服务器的QPS = 单线程QPS * 线程个数 * cpu个数
但是,以上算法有个问题,随着线程数的增长,各个线程在等待cpu的时间将变长,RT会变大,如果持续增加系统负载,可能导致系统崩溃,qps降到0。
RT = 线程在CPU执行时间 + 线程等待CPU执行时间
最佳线程数量计算
假设:RT = 执行时间 50ms + 等待时间 200ms
理论上来说(实际情况远比我们此时的计算复杂,我们只是需要计算一个大概的最佳线程数量),在此RT在等待的200ms中,我们的系统还能处理其他的RT,那么这200ms可以处理等数量为 200/50 = 4。加上我们的RT本身,也就是在RT的时间内(50ms + 200ms)可以处理5个RT。
最佳线程数量 = (执行时间 50ms + 等待时间 200ms)/执行时间 50ms
以上是在单核cpu,以及不考虑cpu其他情况下的理想计算。我们最终推导的公式如下:
最佳线程数量 = (执行时间 + 等待时间 )/执行时间 * cpu个数 * cpu利用率