前言
这类题型在面试中或者实战中都是一个很有深度的题目
今天单独拎出来深度探讨一下
主要的QPS:每秒钟request/事务 数量
.也就是每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
以下解释来源于百度百科:
每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。
区分TPS的概念:一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
QPS基本类似于TPS,但是不同的是,对于一个页面的一次访问,形成一个TPS
一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中
一般qps多了,通过加其服务器横向扩展也是不错的选择,但具体情况还是具体分析(集群规模上去之后,也会引入一堆服务发现、服务治理的新问题)
1. 测试QPS的方法
关于测试QPS的方法有很多,主要参考了如下文章:
面试官之问:知道你的接口“QPS”是多少吗?
大致意思如下:
- 在接口中书写请求次数,在日志中统计请求次数即可
- 在tomcat服务器中的access log指定属性,默认访问的url会有统计其数量
(在日志中这么查询)cat xx.log |grep 'GET /mvc2'|cut -d ' ' -f4|uniq -c|sort -n -r
cut过滤空格,取第4列,uniq -c 在每列旁边显示该行重复出现的次数,sort排序
如果用了各个容器服务器,通过top命令查看其哪个用的多
再进到该容器或者服务器中,使用jstat查看gc状态
iftop
可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等( iftop是类似于top的实时流量监控工具)
2. 提高QPS的方法
在集群化的架构下,可以采用池化(内存池,连接池,线程池),分布式缓存,分布式消息队列,流控技术(服务降级,应用拆分,限流)和数据库高并发(分库分表,读写分离等)提高并发能力
-
增加并发数
后端开发的尽量无服务状态,可以更好的横向扩展
数据库的连接请求量、服务器的连接数、以及与服务器匹配的线程数,满足更多的需求内存池
:通过malloc的分配(大小合适的内存适应相应的内存)线程/线程池
:充分利用资源,减少开销连接池
:数据库预先创建好连接给线程等(提高速度) -
减少平均响应时间
Mq
:流量削峰,适当的给流量减压,还可以使用mq进行降低接口的延迟redis缓存
:进行写少读多的缓存压力算法
:优化程序(通过调用一些算法),可看我这篇文章:java中常见的限流算法详细解析网络层面
:减少网络开销,适当长连接或者短连接数据库层面
:尽量命中索引(单库中尽量MVCC在不加锁的情况下,实现并发读写,同时通过事务隔离级别控制并发效率。)(集群中分库分表,读写分离等)流控
:通过服务降级服务优化等