关于 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 攻击,或者 D
DOS 攻击。
四、处理高并发状况
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 是一个高性能的分布式内存对象缓存系统。
评论