所谓高并发,就是同一时间有不少流量(一般指用户)访问程序的接口、页面及其余资源,解决高并发就是当流量峰值到来时保证程序的稳定性。php
咱们通常用QPS(每秒查询数,又叫每秒请求数)来衡量程序的综合性能,数值越高越好,通常须要压测(ab工具)获得数据。css
假设咱们的一个进程(也能够是线程或者协程)处理一次请求花费了50毫秒(业内达标范围通常是20毫秒至60毫秒),那么1秒钟就能够处理20个请求,一台服务器是能够开不少这样的进程并行去处理请求的,好比开了128个,那么这台机器理论上的QPS=2560。laravel
千万不要小瞧这个数字,当你的QPS真有这么高的时候意味着你的DAU(用户日活)有2560*200=51.2万,业内通常是放大200倍计算,有这样的日活说明作得很不错了。程序员
一台服务器可以达到的最大QPS受不少因素的影响,好比机器参数配置、机房地理位置、CPU性能、内存大小、磁盘性能、带宽大小、程序语言、数据库性能、程序架构等,咱们一一细说。redis
1.机器参数配置sql
这个很好理解,好比服务器最大能够开启128个进程,你设置了最大只开启100个,这属于服务器调优。shell
2.机房地理位置数据库
若是你作海外用户,服务器机房应该选择国外的,反之应该选择国内的,由于机房距离用户越近,在传输上的时间损耗就越低。编程
3.CPU性能后端
CPU性能越好,处理速度就越快,核心数越多,可以并行开启的进程就越多。
4.内存大小
内存越大,程序就能把更多的数据直接放到内存,从内存读取数据比从磁盘读取数据的速度快不少。
5.磁盘性能
这个不用多说吧,通常固态硬盘的性能比机械硬盘的性能好不少,性能越好读写数据的速度就越快。
6.带宽大小
服务器的带宽通常指流出带宽,单位为Mb/S,好比带宽为8Mb/S即1MB/S,若是提供文件下载服务,可能一个用户的下载行为就把服务器带宽用完了。
通常把图片、视频、css文件、JavaScript脚本等资源放到第三方的CDN去,按流量计费,这样就不占用服务器带宽了。
若是用户规模小,基本上一台服务器就行了,这个时候通常会选按固定带宽大小计费。
若是用户规模很大了,基本上会用到负载均衡器来分流,即把流量按照必定的规则分配到不一样的服务器上,负载均衡器通常会按流量来计费。
若是平均一次请求返回的数据大小为50KB,为了达到1000QPS这个指标,须要的带宽峰值=1000508/1024=390.625Mb/S。
咱们在设计接口的时候应该尽可能减小返回的数据大小,好比user_id就能够简化为uid,像图片、视频、css等文件压缩的目的就是减小数据的大小。
7.程序语言
编译型语言的性能通常好于解释型语言的性能,好比go语言性能就好于php语言性能,当语言短时间不会替换时,能够经过堆机器解决高并发问题。
8.数据库性能
一台服务器上部署的数据库老是有一个瓶颈的,好比每秒查询数、每秒写入数。
咱们能够经过增长不少从库解决查询(select语句)的瓶颈,称之为多从库模型,须要注意的是主从同步数据可能有延迟,当修改数据后立刻须要查询时须要设置强制从主库读取。
咱们能够将业务拆分,让某些表存储在一个数据库实例上,另外一些表存储在其余数据库实例上,虽然一个数据库实例有本身的瓶颈,可是不少的数据库实例堆积起来性能就会大大改善,多个数据库实例的方案称之为多主库模型,主要是为了解决写入瓶颈(insert语句、update语句、delete语句)。
若是你有多个主库又有多个从库,你就实现了多主多从模型。
若是一个表存储的数据量很大,这个时候就要考虑分表了(通常用中间件实现),好比按时间分表或者按用户分表,当把一个表的全部分表都放在一个数据库实例上都知足不了要求的时候,你应该把某些分表存储在新的数据库实例上,这个时候一个表的数据分布到了不一样的数据库实例上,这就是所谓的分布式数据库方案了,你须要处理的事情就很复杂了,好比处理分布式事务。
数据库的并发链接数也是有限制的,咱们能够用链接池技术来应对,就是保持必定数量的和数据库的链接不断开的长链接,须要链接数据库的时候就从池子里选择一个链接,用完放回去就行了,这个通常也是用中间件来实现。
好的索引也能提升数据库的性能,有时候比堆多个从库的方案还要好。
若是可以减小数据库的读写,也算间接提升了数据库的性能,好比咱们用redis来作缓存,用消息队列异步落库等。
有时候某些数据用数据库来计算须要很长时间,能够取到元数据(最小粒度的数据)用程序来计算,这称之为用内存换时间。
9.程序架构
好比实现一样的功能,初级程序员写的程序须要循环100次,而高级程序员写的程序只须要循环10次,效果确定不同。
总结
通常大型项目基本是先后端分离的,从性能方面说就是为了将页面渲染的处理在客户端运行,下降服务器的压力。
从带宽层面考虑,css、图片、视频、JavaScript等文件资源能用CDN的就用CDN,能压缩的就尽可能压缩,接口能减少返回数据的大小就尽可能减少。
为了解决编程语言的不足或者单台服务器的瓶颈,能够先堆机器应对。
索引、多主多从、分布式数据库、缓存、链接池、消息队列等是从数据库方便考虑如何优化性能。
有时候程序的耦合性低比程序的性能高更重要,不要一味地追求高性能。
好了各位,以上就是这篇文章的所有内容了,能看到这里的人呀,都是人才。以前说过,PHP方面的技术点不少,也是由于太多了,实在是写不过来,写过来了你们也不会看的太多,因此我这里把它整理成了PDF和文档,若是有须要的能够
更多学习内容能够访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)
以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要的能够加入个人 PHP技术交流群