并发
并发
php如何解决网站高并发和大流量问题
我们说的高并发是什么?
上面的定义明显不是我们通常所言的并发,在互联网时代,所讲的
并发、高并发,通常是指并发访问。也就是在某个时间点,有多少
通常如果一个系统的日PV在干万以上,有可能是一个高并发的系统
有的公司完全不走技术路线,全靠机器堆,这不在我们的讨论范围
高并发的问题,我们具体该关心什么?
QPS:每秒钟请求或者查询的数量,在互联网领域,指每秒响应请
求数(指HTTP请求);
吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
响应时间:从请求发出到收到响应花费的时间。例如系统处理一个
HTTP请求需要100ms,这个100ms就是系统的响应时间
PV:综合浏览量(Page View),即页面浏览量或者点击量,一
个访客在24小时内访问的页面数量
UV:独立访客(UniQue Visitor),即一定时间范围内相同访客
多次访问网站,只计算为1个独立访客
带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小
日网站带宽=PV/统计时间(换算到秒)*平均页面大小(单位KB)*8
峰值一般是平均值的倍数,根据实际情况来定
QPS不等于并发连接数
QPS是每秒HTTP请求数量,并发连接数是系统同时处理的请求数
(总PV数80%)/(6小时秒数20%)=峰值每秒请求数(QPS)
80%的访问量集中在20%的时间
压力测试
测试能承受的最大并发
测试最大承受的QPS值
常用性能测试工具
ab、wrk、http_load、Web Bench、Siege、Apache JMeter
ab
全称是apache benchmark,是apache官方推出的工具
创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行
访问。它的测试目标是基于URL的,因此,它既可以用来测试
apache的负载压力,也可以测试nginx、lighthttp、tomcat、
IIS等其它Web服务器的压力。
ab的使用
模拟并发请求100次,总共请求5000次
ab-c100-n5000待测试网站
注意事项
测试机器与被测试机器分开
不要对线上服务做压力测试
观察测试工具ab所在机器,以及被测试的前端机的CPU,内存,网
络等都不超过最高限度的75%
QPS达到极限
随着QPS的增长,每个阶段需要根据实际情况来进行优化,优化的
方案也与硬件条件、网络带宽息息相关。
QPS达到50
可以称之为小型网站,一般的服务器就可以应付
QPS达到100
假设关系型数据库的每次请求在0.01秒完成
假设单页面只有一个SQL查询,那么100QPS意味着1秒钟完成100
次请求,但是此时我们并不能保证数据库查询能完成100次
方案:数据库缓存层、数据库的负载均衡
QPS达到800
假设我们使用百兆带宽,意味着网站出口的实际带宽是8M左右
假设每个页面只有10K,在这个并发条件下,百兆带宽已经吃完
方案:CDN加速、负载均衡
QPS达到1000
假设使用Memcache缓存数据库查询数据,每个页面对
Memcache的请求远大于直接对DB的请求
Memcache的悲观并发数在2w左右,但有可能在之前内网带宽已
经吃光,表现出不稳定
方案:静态HTML缓存
QPS达到2000
这个级别下,文件系统访问锁都成为了灾难
方案:做业务分离,分布式存储
防盗链
盗链概念
盗链是指在自己的页面上展示一些并不在自己服务器上的内容
获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在
自己的页面上向最终用户提供此内容
常见的是小站盗用大站的图片、音乐、视频、软件等资源
通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流
量均是来自别人的服务器
防盗链的实现方法
Referer
Nginx 模块ngx.http_referer_module用于阻挡来源非法的域
名请求
Nginx指令valid_referers,全局变量$invalid_referer
valid_referers none I blocked I server_names I string..…:
none:"Referer”来源头部为空的情况
blocked:“Referer”来源头部不为空,但是里面的值被代理或
者防火墙删除了,这些值都不以http:/∥或者https://开头.
server_names:"Referer”来源头部包含当前的server_names
location ~.*\.(giflipglpnglflvlswflrarlzip)$
{
valid_referers none blocked imooc.com*.imooc.com;
if(Sinvalid_referer)
{
#return 403;
rewrite M http://www.imooc.com/403.jpg;
}
}
#针对目录的防盗链
location/images/
{
valid_referers none blocked imooc.com*.imooc.com;
if(Sinvalid_referer)
{
#return 403;
rewrite /http:/www.imooc.com/403.jpg;
}
}
加密签名
使用第三方模块HttpAccessKeyModule实现Nginx防盗链
accesskey onloff模块开关
accesskey hashmethod md5|sha-1签名加密方式
accesskey_arg GET参数名称
accesskey_ signature 加密规则
实现方法
location ~.*\.(giflipglpnglflvlswflrarlzip)s
{
accesskey on,
accesskey_hashmethod md5;
accesskey_arg"key”;
accesskey_signature"mypasssremote_addr";
}
线程与进程的区别
1.线程是进程内的一个执行单元,进程内至少有一个线程,它们共
享进程的地址空间,而进程有自己独立的地址空间
2.进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3.线程是处理器调度的基本单位,但进程不是
4.二者均可并发执行
5.每个独立的线程有一个程序运行的入口、顺序执行序列和程序的
出口,但是线程不能够独立执行,必须依存在应用程序中,由应用
程序提供多个线程执行控制
线程与协程的区别
1.一个线程可以多个协程,一个进程也可以单独拥有多个协程
2.线程进程都是同步机制,而协程则是异步
3.协程能保留上一次调用时的状态,每次过程重入时,就相当于进
入上一次调用的状态
什么是多进程、多线程
多进程
同一个时间里,同一个计算机系统中如果允许两个或两个以上的进
程处于运行状态,这就是多进程
边看慕课网视频,边使用WebIDE
多开一个进程,多分配一份资源,进程间通讯不方便
多线程
线程就是把一个进程分为很多片,每一片都可以是一个独立的流程
与多进程的区别是只会使用一个进程的资源,线程间可以直接通信
多个概念之间的区别
例子
单进程单线程:一个人在一个桌子上吃菜
单进程多线程:多个人在同一个桌子上一起吃菜
多进程单线程:多个人每个人在自己的桌子上吃菜
同步阻塞
多进程
最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题
一个请求创建一个进程,然后子进程进入循环同步堵塞地与客户端
连接进行交互,收发处理数据
多线程
用多线程模式实现非常简单,线程中可以直接向某一个客户端连接
发送数据
PHP并发编程实践
PHP的Swoole扩展
消息队列
接口的并发请求