这并非一个回答的问题的文章,而是由此引起的一个思考。php
你们内心仔细想一想,当大家听到高并发网站时,内心对这个网站是个什么概念?首先想到的是淘宝吗?带着问题,咱们一块儿思考技术html
写这个话题是由于我对搜索引擎给个人答案很不满意,而后决定把思考的一些东西分享出来,但愿能够你们彼此讨论下。git
咱们常常在面试的时候,被问到有没有高并发的经验?先不说哪些考高并发的装逼公司。我思考的是什么才算是高并发?你一天几个pv确定高不了。首先在网上查找一下,并未找到明确的标准定义。那么什么是并发呢?github
并发,在操做系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。面试
摘自百度百科缓存
上面的定义明显不是咱们一般所言的并发,在互联网时代,所讲的并发、高并发,一般是指并发访问。也就是在某个时间点,有多少个访问同时到来。服务器
我看到有人给高并发下了相似的定义:微信
高并发一般是指咱们提供的系统服务可以同时并行处理不少请求。网络
来看看这个定义,这里首先把并发给混淆到并行了。关于并发并行的区别看这里,我就很少说,继续探讨并发。并发
而后定义又说不少请求?什么叫不少请求?作为中国人,这个词让我想象力一发不可收拾......好了,拉回来,继续本文。
那么从上面的分析,能够看出来高并发在网络上业界也没有明确的定义。但根据我搜索状况,通常都是pv在千万级别以上的公司才会涉及到这个概念。因此我得出一个自定义概念:若是某个系统的日pv在千万级别以上,他就多是一个高并发的系统。
为何说是可能?那是由于有的公司彻底不走技术路线,全靠机器堆,这不在咱们的讨论范围。
讲真话,高并发是个比较抽象的概念。很难有一个统一的可衡量的标准。哪么有一些其它维度的标准指标来衡量系统的性能吗?搬出之前计算机课程里边的一些指标来跟你们聊聊。
先声明几个概念,别打瞌睡。
这里必定要注意呃,QPS ≠ 并发数
并发是指,某个时刻有多少个访问同时到来。QPS是指秒钟响应的请求数量。那么这里就肯容易推算出一个公式:
QPS = 并发数 / 平均响应时间
后面咱们的分析都是围绕这个公示来进行展开,没明白的再回味一下。
如今咱们来假设一个场景:既然QPS是每秒钟处理的http请求数量。那么1s = 1000ms。假设咱们当前一个http请求服务器处理完成须要100ms(即那么 平均响应时间 = 100ms )。那么它1s钟能够处理10个请求。也就是说 qps = 10。推算出 并发数 = 10
经常咱们被问到高并发的问题,其实从某种程度上来讲是怎么提升现有程序的性能。如今咱们基于上面的假设,来进行分析。假设如今有个系统性能上就是咱们上面的假设,它天天有 300万pv,运行在单机上(固然常常宕机),按照上面的系统性能数据,给出优化解决方案。
经过上面的分析,要提高并发能力,咱们就须要提高咱们的qps(其实这里并不彻底正确,为了说明问题,咱们先放弃一部分正确性)
最快速解决方案,就是增长机器。咱们根据以上状况来实际计算一下。
根据平常经验,80% 的访问量集中在 20%的时间,算一下这 200w pv实际须要机器达到多少qps才能知足。
qps = (200w * 0.8) / (24 * 3600 * 0.3) qps = 61.7
实际上若是在单机上,要求咱们每秒钟处理请求必须达到 61.7 以上才行,而实际上咱们当前系统的qps是 10
。那么怎么解决?
方案一:上机器
我的的能力是有限的,团队的力量是无穷的。既然一台机器搞不定,咱们就多上几台机器。这就涉及到db主从、读写分离、负载均衡等技术。
它的原理就是分流,把之前集中的压力分散开来。改方案见效快,灵活,实践起来也更快。
方案二:增长单机性能
单机到底性能可以增长到一个什么程度,这取决于你的机器配置,也取决于你的服务到底有多复杂。
ps: 写到这里忽然有点可以理解为什网上对高并发都是讲不少请求,没有具体数据了,由于这真的只能针对业务来说,100个并发对静态网页来讲根本没有的事儿,可是对于某些密集计算型的估计...
那么常见的单机如何提高性能?好比:增长不常变化数据的缓存,开启php的opcache,优化代码(如:n+1问题、多重嵌套循环、深层递归等),db表优化等等。因为这些每个点拿出来都够写一本书了。咋就不继续下去。
因为笔者本身也是没有实际经历过kw级别pv场景,不少东西讲的不必定对,本文也是理清本身的一点思路。但愿可以与更多朋友进行讨论。
也但愿本文可以解决你的一点疑惑,让咱们可以从高大上的概念落实到实际问题中去。
GitHub:https://github.com/helei112g
我在github开源了支付宝支付、微信支付、招商一网通支付的php sdk。但愿可以帮助你提高项目开发的效率。项目地址