一、什么是QPS?
QPS(Query Per Second,每秒处理请求数)是用来衡量服务性能的一个重要指标,解决每秒数万次的高并发场景,这个指标非常关键。
吞吐量:
和高并发相关的,还有一个概念,那就是吞吐量(每秒的数据处理量)。吞吐量是在给定时间段内系统完成的交易数量,即系统的吞吐量越大,说明系统在单位时间内完成的用户或系统请求越多, 系统的资源得到充分利用。我们通常衡量一个Web系统的吞吐率的指标就是QPS。
QPS的定义:
对一个特定的查询服务器在规定时间内所处理流量的多少
计算公式:
QPS = 并发量 / 平均响应时间
附注:通常QPS用来衡量服务器性能,我们也是不断的为增加它的数量而优化改进,通过多线程、增加负载、甚至提高代码质量、算法优化等方式。当然优化性能是有上限的,我们需要在性能和投入上作出一定的平衡。要对现有的业务状况、未来的发展潜力以及爆发力上作出一些判断,很好的驾驭它是需要花费一些精力的,需要经验和技术能力同时发挥作用,让效率和投入达到最好的产出。
二、QPS简单示例
举个例子,我们假设处理一个业务请求平均响应时间为100ms,同时系统内有10台Apache的Web服务器,配置Apache的最大连接数目为500,那么,我们的Web系统的理论峰值QPS为:
10*500/0.1 = 50000 (5万QPS)
上述计算结果,1秒钟可以处理完5万的请求,系统似乎看起来很强大,但实际情况并没有这么理想,在高并发的实际场景下,服务器都是处于高负载的状态,在这种状态下,平均响应时间也会被大大增加。一个高配置的至强处理器能支持的最大并发连接是1 ~ 2万,如果访问量超过2万那么就需要更高性能的服务器才能解决,如果服务器硬件不给力,软件怎么优化都是于事无补的。就Web服务器而言,Apache打开了越多的连接进程,CPU需要处理的上下文切换也越多,额外增加了CPU的消耗,必然会直接导致平均响应时间增加。
假设我们的web系统在5万QPS的高并发状态下,平均响应时间从100ms变为250ms(可能会更高),那么,此时我们的Web系统的理论峰值QPS则变为:
20*500/0.25 = 40000 (4万QPS)
如此一来,我们的web系统只剩下4万的QPS,面对5万每秒的请求,中间相差了1万。这就是高并发状况,在某一秒内,服务器所有可用连接进程都在满负荷工作中,却仍然有1万个新的请求,没有连接进程可用,系统将陷入到崩溃的状态(CPU爆满)。举个通俗的示例,某个高速路口有5条车道,每秒可以同时通过5部车,突然有1条车道上出了车祸,只剩下4个车道可以通过,也就是说,这个路口1秒钟现在只能通过4部车,车流量仍然依旧,结果必定出现大塞车。
三、什么情况下会出现高并发?
1、某个业务请求接口出现问题,响应时间变得极慢,将整个Web请求响应时间拉得很长,逐渐将Web服务器的可用连接数占满,进而影响到其他正常的业务请求,导致无连接进程可用。
2、用户的行为特点,系统越是不可用,用户的点击越频繁,恶性循环最终导致“雪崩”。例如在负载均衡体系中,其中一台Web服务器挂了,导致流量分散到其他正常工作的机器上,再导致正常的服务器也挂,然后恶性循环,将整个Web系统拖垮。
3、大量的CC攻击,或者DDOS攻击。
四、处理高并发状况
1、重启Apache服务
如果系统因为高并发导致雪崩”,这种情况下贸然重启Apache服务,是无法解决问题的。最常见的现象是,Apache服务启动起来后,立刻又挂掉了。这个时候,最好在CGI入口层将流量拒绝,然后再将其重启。
2、过载保护
一些特殊的业务场景(例如秒杀和抢购),流量往往是超乎我们系统的准备和想象的。这个时候,过载保护是必要的。如果检测到系统满负载状态,选择拒绝请求也是一种保护措施。正确的做法是将过载保护设置在CGI入口层,快速将客户的直接请求返回。
什么是CGI?
CGI的定义:
CGI(Common Gateway Interface))是HTTP服务器与你的或其它机器 上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上 。
CGI的功能:
绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。
CGI的处理步骤:
- 通过Internet把用户请求送到服务器。
- 服务器接收用户请求并交给CGI程序处理。
- CGI程序把处理结果传送给服务器。
- 服务器把结果送回到用户。
五、解决网站高并发的建议
1、数据库相关
- 数据库查询尽量不用“ select * from 表名 ”
- 避免相关子查询
- 给经常查询的添加索引
- 用排序来取代非顺序存取
2、MySQL服务器最好安装在Linux操作系统中。
3、关于web服务器是选Apache,还是Nginx,在高并发的情况下推荐使用Nginx,Nginx是Apache服务器不错的替代品。Nginx内存消耗少,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2~3万并发连接数。
4、php不需要的模块尽量关闭。
5、使用memcached缓存,Memcached是一个高性能的分布式内存对象缓存系统。
6、IIS或Apache启用GZIP压缩优化网站,压缩网站内容可以大大节省网站流量。
六、高并发解决方案
应用层面:读写分离、缓存、队列、集群、令牌、系统拆分、隔离、系统升级(可水平扩容方向)。
时间换空间:降低单次请求时间,这样在单位时间内系统并发就会提升。
空间换时间:拉长整体处理业务时间,换取后台系统容量空间。
七、如何优化提升QPS呢?
1、调整Apache的最大连接数(并发数量),可以参考这篇文章:https://blog.csdn.net/qq15577969/article/details/109702961
2、内存操作级别的存储Redis,在高并发的状态下,存储的响应时间至关重要。
3、增加服务器配置,例如选择性能更好的CPU,加大网络带宽。
4、使用cdn加速,高防cdn和高防IP在一定程度上都可以解决高并发问题。
5、负载均衡,例如增加多台服务器,然后使用负载均衡技术,将流量平均分散各个服务器上。
原文链接:https://blog.csdn.net/qq15577969/article/details/109702077