上述计算结果,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、用户的行为特点,系统越是不可用,用户的点击越频繁,恶性循环最终导致“雪
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
崩”。例如在负载均衡体系中,其中一台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压缩优化网站,压缩网站内容可以大大节省网站流量。
六、高并发解决方案
应用层面:读写分离、缓存、队列、集群、令牌、系统拆分、隔离、系统升级(可水平扩容方向)。
时间换空间:降低单次请求时间,这样在单位时间内系统并发就会提升。
空间换时间:拉长整体处理业务时间,换取后台系统容量空间。