高并发架构相关概念
我们关系什么问题?
高并发:一个时间点,有多少个访问。日pv千万以上,算是一个高并发系统。
QPS:每秒钟请求或者查询的数量,或者每秒相应的请求(http请求)。
峰值每秒请求数(QPS) = (总PV数 * 80%)/ (6小时秒数 * 20% )
也就是说80%的访问量都集中在20%的时间里,2/8定律
并发连接数: QPS不等于并发连接数。QPS是每秒HTTP请求的数量,并发连接数是系统同时处理请求的数量。
吞吐量:单位时间内处理的请求数量(通常由QPS和并发数决定)
响应时间:从请求发出到收到相应的时间。例如系统处理一个HTTP请求需要100ms,这个100ms就是系统相应时间。
PV: 综合浏览量(Page View)也就是页面浏览量或者点击量,一个访客在24小时内访问的页面数量。(一个页面无限次刷新只算一个pv,同一个人浏览你的网站同一个页面,只记作一个PV)
UV:独立访客(UniQue Visitor),一定时间范围内相同访客多次访问网站,只记作一个独立访客。
带宽: 计算带宽大小需关注两个指标,峰值流量和页面的平均大小。下面是一个计算日网站带宽的平均公式。
日网站带宽 = PV / 统计时间(换算到秒)* 平均页面大小 (单位KB)* 8
峰值一般时平均值的倍数,实际情况来定。
压力测试(了解单台服务器的QPS)
测试能够承受的最大并发,测试能够承受的最大QPS值。
比如日QPS算出来是200,我们的单台服务器QPS是50,那么我们就需要最少4台服务器才能完成正常访问。
常用的性能测试工具有:ab(推荐)、wrk、http_load、web Bench、Siege、Apache JMeter等
ab全称 apache benchmark,是apache官方推出的工具。他可以创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。他的测试目标基于URL,因此他可以用来测试Nginx、apache、iis 、lighthttp、tomact等web服务器的压力。
ab的使用:模拟并发请求100次 ,总共请求5000次。也就是说请求5000次每次100个。
1 |
ab -c 100 -n 5000 待测网站 |
测试要注意:
测试机器和被测试机器要分开。
不要对线上服务做压力测试,导致不必要的问题。
观察测试工具ab所在机器,以及被测试的前端机的CPU、内存、网络等都不要超过75%。
ab安装
1 |
yum -y install http-tools |
1 |
ab |
只输入ab可以查看命令选项参数。
1 2 3 4 5 6 |
ab:http请求 abs:https请求 -n:测试几次 -c: 模拟多少客户端 -T:内容类型。这个一般和-p 一起使用 -p:包含POST参数的文件 |
我们来使用ab访问一个php文件
1 |
ab -c 100 -n 5000 http://**********/phpinfo.php |
得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Server Software: nginx //nginx服务器 Server Hostname: ****.****.***** //网址或者ip Server Port: 80 //端口 Document Path: /phpinfo.php //访问的文件地址 Document Length : 83880 bytes //文档大小 Concurrency Level : 100 //并发数 Time taken for tests: 9.894 senconds //花费时间 Complete request: 5000 //请求次数 Failed requests: 2946 //请求失败次数 Requests per second: 505.36[#/sec] (mean) //QPS值 Percentage of the requests served within a certain time (ms) 50% 197 //最短相应时间 66% 198 75% 198 80% 199 90% 199 95% 200 98% 200 99% 200 100% 241 (Longest request) //最长相应时间 |
我的服务器一般般所以不能承载这样的php请求,但是为什么说要静态化,因为静态化就对服务器要求变少。我们来试一下,同样的服务器,我们用一个静态文件。
静态页面压力测试
1 |
ab -c 100 -n 5000 http://**********/index.html |
得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Server Software: nginx //nginx服务器 Server Hostname: ****.****.***** //网址或者ip Server Port: 80 //端口 Document Path: /index.html //访问的文件地址 Document Length : 290 bytes //文档大小 Concurrency Level : 100 //并发数 Time taken for tests: 0.241 senconds //花费时间 Complete request: 5000 //请求次数 Failed requests: 0 //请求失败次数 Requests per second: 6988.36[#/sec] (mean) //QPS值 Percentage of the requests served within a certain time (ms) 50% 9 //最短相应时间 66% 9 75% 9 80% 10 90% 10 95% 10 98% 11 99% 11 100% 13 (Longest request) //最长相应时间 |
所以静态优化很重要。
QPS达到极限
随着QPS增长,每个阶段需要根据实际情况进行优化,优化的方案与硬件条件和网络带宽息息相关。
QPS达到50如何优化?
这种就是小型网站,一般的服务器就可以了。
QPS达到100如何优化?(数据库会遇到问题)
假设关系型数据库每次请求在0.01秒(理想状态)完成。
假设单个页面只有一个sql查询,那么100QPS就意味着1秒钟完成100次请求,但是此时我们并不能保证数据库查询能完成100次。
解决方案:数据库缓存层、数据库负载均衡
QPS到达800如何优化?(带宽会遇到问题)
假设我们使用百兆带宽,意味着网站出口的实际带宽为8M左右。
假设每个页面只有10K,在这个条件下,百兆带宽已经饱和了。
方案:CDN加速、负载均衡
QPS到达1000如何优化?
假设使用Memcache缓存数据库查询数据,每个页面对Memcache的请求远大于直接对DB的请求。
Memache的悲观并发数在2万左右,但可能在之前内网带宽已经吃光,表现出不稳定。
方案: 静态HTML缓存
QPS到达2000如何优化?
这个级别下,文件系统访问锁都成了灾难
方案:做业务分离,分布式存储
其他方向优化
1、流量优化:
防盗链处理
2、前端优化:
减少HTTP请求,合并css和js。
添加异步请求,防止一个时间点集中访问。
启用浏览器缓存和文件压缩。
CDN加速
独立图片服务器
3、服务端优化:
页面静态化处理
并发处理:异步处理。swoole、消息队列处理kafka、rebbitmq
4、数据库优化
数据库缓存redis,数据库mysql索引等
分库分表、分区操作。(垂直拆分,水平拆分等)可以借助工具mycat、heisenberg。
读写分离。一个服务器读,一个服务器写。
负载均衡 LVS
5、web服务器优化
负载均衡 :nginx反向代理实现负载均衡,LVS