网站架构学习(四)之高性能架构

来源:互联网 发布:月季花苗便宜淘宝店铺 编辑:程序博客网 时间:2024/05/29 09:31

前言

什么是高性能的网站?
性能架构设计方案:
实例一:A方案和B方案,A方案在小于100个并发用户访问时,每个请求的响应时间是1秒,当并发请求到达200的时候,请求响应时间增加到10秒。B方案不关100个并发用户访问还是200个并发用户访问,每个请求的响应时间都差不多是1.5秒。哪个好?
实例二:A网站服务器平均每个请求的处理时间是500毫秒,B网站服务器平均每个请求的处理时间是1000毫秒,为什么用户反映B网站速度快?

网站性能是客观的指标,可以具体体现到响应时间、吞吐量等技术指标,同时也是主观的感受。

网站性能测试

不同角度去看网站的性能

1.用户视角的网站性能
网站性能就是用户在浏览器上直观感受到网站响应速度快还是慢。(包含:用户计算机和网站服务器通信时间、网站服务器处理的时间、用户计算机浏览器构造请求解析响应数据的时间)

对于前端架构,可以优化HTML样式,使用并发异步(Ajax),调整浏览器缓存策略、CDN、反向代理等手段,可改善用户视角的网站性能。

2.开发人员视角的网站性能
开发人员关注的是应用程序本身及相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标。

3.运维人员视角的网站
运维人员关注基础设施性能和资源利用率,如网络运营商的带宽能力、服务器硬件的配置、数据中心网络架构、服务器和网络带宽的资源利用率等。
优化手段是建设优化骨干网,利用虚拟化技术优化资源利用率等。

性能测试指标

网站性能测试主要指标有响应时间、并发数、吞吐量、性能计数器等。

1.响应时间
指应用执行一个操作需要的时间,包括从出发请求开始到收到最后响应数据所需要的时间。

2.并发数
指系统能够同时处理请求的数目,这个数字反映了系统的负载特性。

3.吞吐量
指单位时间系统处理的请求数量,体现系统的整体处理能力。对于网站,可以用“请求数/秒”或者“页数/秒”来衡量。
吞吐量是每天通过收费站的车辆数目。 一个是请求数量
并发数是在告诉公路上行驶的车辆数目。 一个是处理数量

性能计数器
它描述的是服务器或操作系统性能的一些数据指标,包括System Load、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等指标。
System Load(系统负载) 指当前被CPU执行和等待被CPU执行的进程数目总和,是反应系统忙闲程度的重要指标。

性能测试方法

性能测试
对系统不断施加压力,验证系统在资源可接受范围内。

负载测试
增加并发请求,知道指标达到安全临界值,如某种资源到达饱和,对系统继续施加压力,系统的处理能力不但不能提高,反而会下降。

压力测试
超过安全负载的情况下,知道系统崩溃,获得最大压力承受能力。

稳定性测试
系统运行较长时间,查看系统是否稳定。

Web前端性能优化

1.游览器访问优化
(1)减少http请求
在http1.0中http是无状态,每次请求都要建立一次连接。
减少http的手段有合并CSS,合并JavaScript,合并图片。这样浏览器只需要一次请求即可。
(2)使用浏览器缓存
通过设置Http头中Cache-Control和Expires属性,可设定浏览器缓存。
Cache-Control请求头或响应头中都可以存在。
(3)启动压缩
在服务端对文件进行压缩,在浏览器对文件进行解压缩,可有效减少通信传输的数据量。
(4)Css放在页面上面,javascript放在页面最下面
(5)减少Cookie传输
静态资源可以考虑使用独立域名,因为传输cookie是不必要的。

2.CDN加速
CDN是部署在网络运营商最近的机房的。离用户是最近的。
CDN缓存的一般是静态文件。

3.反向代理
反向代理具有保护网站安全的作用,外部和内部之间的一个屏障。
反向代理具有加速Web请求的作用(缓存)。
反向代理具有负载均衡的作用。

应用服务器优化

网站优化第一条:优先考虑缓存优化性能。

要合理使用缓存,避免缓存数据是频繁修改的(数据写入缓存,应用来不及读取缓存,缓存失效),将没有热点的访问移除(内存资源是很宝贵的),数据不一致造成脏读的情况(缓存一般是设置失效时间的,需要重新从数据库中加载),放在缓存雪崩(大量缓存失效,可以对不同数据设置不同的失效时间),缓存预热(在缓存系统启动时,把热点数据加载好),缓存穿透问题(持续访问一个不存在的key,那么可以在缓存设置一个,value不想关的值即可)。

在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,对数据库造成巨大压力,响应延迟大。

消息队列具有很好的消峰作用,将短时间高并发产生的事务消息存储在消息队列中,从而消平高峰期的并发事务。

代码优化

1.多线程
线程比进程更轻量,更少占有系统资源。
使用多线程的原因是:IO阻塞及多CPU。
启动线程数=【任务执行时间/(任务执行时间-IO等待时间)】*CPU内核数
保证线程安全,将对象设计为无状态的对象,使用局部对象(在方法内,保证线程安全),并发访问资源时使用锁。

2.资源优化
数据库连接池使用:c3p0(回收空闲连接)或者dbcp。
资源复用:单例模式,对象池。