我们一样平常用QPS(每秒查询数,又叫每秒要求数)来衡量程序的综合性能,数值越高越好,一样平常须要压测(ab工具)得到数据。
假设我们的一个进程(也可以是线程或者协程)处理一次要求花费了50毫秒(业内达标范围一样平常是20毫秒至60毫秒),那么1秒钟就可以处理20个要求,一台做事器是可以开很多这样的进程并行去处理要求的,比如开了128个,那么这台机器理论上的QPS=2560。
千万不要小瞧这个数字,当你的QPS真有这么高的时候意味着你的DAU(用户日活)有2560200=51.2万,业内一样平常是放大200倍打算,有这样的日活解释做得很不错了。
一台做事器能够达到的最大QPS受很多成分的影响,比如机器参数配置、机房地理位置、CPU性能、内存大小、磁盘性能、带宽大小、程序措辞、数据库性能、程序架构等,我们逐一细说。
1.机器参数配置
这个很好理解,比如做事器最大可以开启128个进程,你设置了最大只开启100个,这属于做事器调优。
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,能压缩的就只管即便压缩,接口能减小返回数据的大小就只管即便减小。
为理解决编程措辞的不敷或者单台做事器的瓶颈,可以先堆机器应对。
索引、多主多从、分布式数据库、缓存、连接池、行列步队等是从数据库方便考虑如何优化性能。
有时候程序的低耦合性比程序的高性能更主要,不要一味地追求高性能。