网站的高性能架构

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


网站性能测试

网站性能视角

性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。

用户视角

从用户角度,网站性能就是在浏览器上直观感受到的网站响应速度。

原因:

1、不用计算机的性能差异;

2、不同浏览器解析HTML速度的差异;

3、不同网络运营商提供的互联网带宽服务的差异;等

优化手段:

采用前端架构优化,比如:

1、通过优化页面HTML样式;

2、利用浏览器端的并发和异步特性;

3、调整浏览器缓存策略;

4、使用CDN;

5、使用反向代理;等

开发人员视角

开发人员关注的主要是应用程序本身及其相关子系统的性能,包括:响应延迟、系统吞吐量、并发处理能力、系统稳定性等。

优化手段:

1、使用缓存加速数据读取;

2、使用集群提高吞吐能力;

3、使用异步消息加快请求响应,及实现削峰

4、代码优化;等

运维人员视角

运维人员关注基础设施性能和资源利用率,如网络运营商的带宽能力、服务器硬件配置、数据中心网络架构、服务器和网络带宽的资源利用率等。

优化手段:

1、建设优化骨干网;

2、使用高性价比定制服务器;

3、利用虚拟化技术优化资源利用率;等

网站性能指标

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

1、响应时间

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

测试程序一般通过重复请求,计算得到单次请求的响应时间。

2、并发数

并发数是指系统能够同时处理请求的数目,也反映了系统的负载特性。

测试程序通过多线程模拟并发用户的办法来测试系统的并发处理能力,并在两次请求之间加入一个随机等待时间。

3、吞吐量

吞吐量是指单位时间内系统处理的请求数量,体现系统的整体处理能力。

常量化指标:TPS(每秒事务数)HPS(每秒HTTP请求数)QPS(每秒查询数)

4、性能计数器

性能计数器是描述服务器或操作系统性能的一些数据指标。包括:System Load、对象与线程数、内存使用、 CPU使用、磁盘与网络I/O等指标。运维可对其设置报警阈值。

System Load(系统负载):指当前正在被CPU执行和等待被CPU执行的进程数目总和。Load的理想值是CPU的数目。

性能测试方法

性能测试可分为:性能测试负载测试压力测试稳定性测试


性能优化

性能优化根据网站的分层架构,可分为:Web前端性能优化应用服务器性能优化存储服务器性能优化等。

Web前端性能优化

Web前端主要包括:浏览器加载、网站视图模型、图片服务、CDN服务等,主要优化手段包括:浏览器访问优化、使用反向代理、使用CDN加速等

1、浏览器访问优化

(1)减少HTTP请求

HTTP协议是无状态的应用层协议,每次HTTP请求都要建立通信链路,进行数据传输;在服务器端,每个HTTP请求都需要启动独立线程来处理。

减少HTTP的主要手段:合并CSS、合并JavaScript、合并图片。如果每张图片都有不同的超链接,可通过CSS偏移响应鼠标点击操作,构造不同的URL。

(2)使用浏览器缓存

将网站的静态资源如:CSS、JS、Logo、图标等,缓存在浏览器中。通过设置HTTP头中Cache-Control和Expires的属性,设定浏览器缓存,以及缓存时间。

如果采用了浏览器缓存,若静态资源文件变化需要及时应用到客户端浏览器,则可通过改变文件名以实现。

浏览器缓存策略在更新静态资源时,采用逐量更新的方法,避免浏览器突然大量缓存失效,造成服务器负载骤增,网络堵塞等情况。

(3)启用压缩

在服务器端对文件进行压缩、在浏览器端对文件进行解压,可有效减少通信传输数据量。

但压缩、解压会对服务器、浏览器造成压力,需权衡考虑。

(4)CSS放在页面最上方、JavaScript放在页面最下面

浏览器加载JS后立即执行,有可能会阻塞整个页面加载。

如果页面解析时就需要用到JS,则应该放在页面上方。

(5)减少cookie传输

Cookie包含在每次请求和响应中,太大的cookie会严重影响数据传输;

对静态资源的访问,发送cookie没有意义,因此可以让静态资源使用独立域名访问,避免发送cookie。

2、CDN加速

CDN部署在网络运营商的机房,用户请求路由的第一条就到达了CDN服务器,因此可以将CDN作为缓存,存放静态资源,如:图片、文件、CSS、Script脚本、静态网页等,可以极大的改善网页的打开速度。

3、反向代理

反向代理位于网站机房一侧,代理网站Web服务器接收HTTP请求,来自互联网的访问请求必须经过代理服务器,具有保护网站安全的作用。

代理服务器可以通过配置缓存功能加速Web请求,静态内容和动态内容都会被缓存。动态内容发生改变时,通过内部机制通过反向代理缓存失效,反向代理会重新加载最新的动态内容。


应用服务器性能优化

应用服务器是处理网站业务的服务器,网站的业务代码部署在这里,优化手段有:缓存集群异步等。

1、分布式缓存

缓存的本质是一个内存Hash表。

(1)分布式缓存架构

分布式缓存指缓存部署在多个服务器组成的集群中,以集群方式提供缓存服务,其架构有两种:一种以JBoss Cache为代表的需要更新同步的分布式缓存、一种以Memcached为代表的不互相通信的分布式缓存。

1)JBoss Cache

在集群中所有服务器中保存相同的缓存数据,当某台服务器有缓存数据更新,会通知集群中其他机器更新缓存数据或清除缓存数据。

JBoss Cache通常将应用程序和缓存部署在同一台服务器上,这是因为应用程序可以快速获取缓存数据。

缺陷:缓存数据的数量受限于单一服务器的内存空间;当集群规模较大的时候,缓存更新信息需要同步到集群所有机器,代价太大。

2)Memcached

Memcached是一种集中式的缓存集群管理,即互不通信的分布式架构方式。

其将缓存与应用程序分离部署:缓存系统部署在一组专门的服务器上;应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据。

优点:扩展性好、伸缩性好、可存储海量数据。

a、简单的通信协议

远程通信需要考虑两方面问题:一是通信协议,即选择TCP协议还是UDP协议,还是HTTP协议;二是通信序列化协议,如:XML、JSON等文本序列化协议,还是Google Protobuffer等二进制序列化协议。

Memcached使用TCP协议作为通信协议,使用一套基于文本的自定义协议作为序列化协议(以一个命令开头,后面是一组命令操作数,如:get<key>)。

b、高性能的网络通信

Memcached服务端通信模块基于Libevent,一个支持事件触发的网络通信程序库。

特点:Libevent在长连接方面表现稳定。

c、高效的内存管理

内存管理中的难题主要是内存碎片。

Memcached使用固定内存分配机制。其原理是:将内存空间分为一组slab,每个slab里又包含一组chunk,同一个slab里的每个chunk的大小是固定的,拥有相同大小的chunk的slab被组织在一起,称为slab_class。存储数据时,根据数据的size大小,寻找一个大于size的最小chunk将数据写入。

2、异步操作

使用消息队列将调用异步化,可改善网站的扩展性、系统的性能。

通过在应用服务器和数据库服务器之间加入消息队列服务器。

消息队列服务器处理速度远大于数据库服务器,可以使用户的响应延迟得到改善;消息队列具有很好的削峰作用——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。

补充:使用消息队列进行业务异步处理后,需要适当修改业务流程进行配合,因为用户接收到响应时,可能其消息还未被处理。

3、使用集群

在网站高并发访问时,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理。

4、代码优化

(1)多线程

采用多线程的方式响应并发用户请求。

线程安全解决手段:

a、将对象设计为无状态对象

无状态对象是指对象本身不存储状态信息,使得多线程并发访问时不会出现状态不一致。Java Web中的servlet对象就是无状态对象。Web开发中常用的贫血模型对象也是无状态对象。

b、使用局部对象

在方法内部创建对象,可避免对象在线程间传递

c、并发访问资源时使用锁

在多线程访问资源时,通过锁的方式使线程并发操作转化为顺序操作,避免资源被并发修改。

缺点:锁机制会导致同步顺序执行,会对系统性能产生严重影响。

(2)资源复用

系统运行时,尽量减少那些开销很大的系统资源的创建和销毁,如:数据库连接、网络通信连接、线程、复杂对象等。

资源复用的两种模式:单例对象池

a、单例
b、对象池

比如数据库连接,频繁创建关闭数据库连接,对数据库服务器而言是灾难性的,并且需要花费较长的时间。

对象池模式:数据库连接创建之后,将连接对象放入对象池容器中,应用程序需要连接时,就从对象池中获取一个空闲的连接使用,使用完后归还到对象池中。

比如HTTP请求,同样可以创建一个线程池。

(3)数据结构

缓存的本质是Hash表。字符串Hash散列算法:Time33算法——对字符串逐字符串迭代乘以33,求得Hash值。

(4)垃圾回收

如果Web应用运行在JVM等具有垃圾回收功能的环境中,那么垃圾回收可能会对系统的性能特性产生巨大影响。


存储性能优化

1、机械硬盘 VS 固态硬盘

机械硬盘具有快速顺序读写、慢速随机读写的访问特性。

2、B+树 VS LSM树

(1)B+树

针对机械硬盘特性的一种算法,保证数据在不断更新、插入、删除后依然有序,从而加快数据检索速度。

原理:本质是N叉排序树。以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和磁盘位置,将其加载到内存中然后继续查找,直到找到所需的数据。

目前数据库多采用两级索引的B+树,树的层次最多三层。

(2)LSM树

很多NoSQL产品使用的数据结构。

原理:本质是一个N阶合并树。数据写操作(包括插入、修改、删除)都在内存中进行,并且都会创建一个新纪录(修改会记录新的数据值,删除会记录一个删除标识),这些数据在内存中仍然还是一棵排序树,当数据量超过设定的内存阈值后,会将这棵排序树与磁盘上最新的排序树合并。当这棵排序树的数据量也超过设定阈值后,和磁盘上的下一级的排序树合并。合并过程中,会用最新的数据覆盖旧的数据(或者记录为不同的版本)。

3、RAID VS HDFS

(1)RAID

RAID(廉价磁盘冗余阵列)主要是是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。通过使用RAID技术,实现数据在多块磁盘上并发读写和数据备份。

RAID技术分为:RAID0、RAID1、RAID10、RAID5、RAID6

a、RAID0

优点:数据在从内存缓冲区写入磁盘时,根据磁盘数量将数据分成N份,这些数据同时并发写入N块磁盘,实现N倍加速。

缺点:RAID0不做数据备份,N块磁盘中只要有一块损坏,数据完整性就被破坏,所有数据都会损坏

b、RAID1

优点:数据写入磁盘时,将一份数据同时写入两块磁盘,即使有一块磁盘损坏,也能通过插入一块新磁盘复制数据自动修复,可靠性较高。

c、RAID10

综合RAID0和RAID1,将所有磁盘平均分成两份,数据同时在两份磁盘写入,同时进行N等分同时写数据,提速N倍。

缺点:磁盘利用率底。

d、RAID3

在数据写入磁盘时,将数据分成N-1份,并发写入N-1块磁盘,并在第N块磁盘记录校验数据,任何一块磁盘损坏(包括校验数据磁盘),都可以利用其它N-1

块磁盘的数据恢复。

缺点:第N块磁盘频繁写,导致容易损坏。

e、RAID5

和RAID3相似,校验数据不是写在第N块磁盘,而是螺旋式地写入所有磁盘中。避免频繁写一块磁盘。

f、RAID6

和RAID5相似,数据只写入N-2块磁盘,并螺旋式地在两块磁盘中写入校验信息,

总结,RAID技术在传统关系数据库及文件系统中应用比较广泛,但是在大型网站比较喜欢使用NoSQL,以及分布式文件系统中,RAID不合适。

(2)HDFS

HDFS(Hadoop分布式文件系统)中,系统在整个存储集群的多台服务器上进行数据并发读写和备份。

HDFS以块(Block)为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,每写完一个Block,HDFS将其自动复制到另外两台机器上,保证每个Block有三个副本。类似于RAID1.

当对文件进行处理计算时,通过MapReduce并发计算任务框架,可以启动多个计算子任务(MapReduce Task),同时读取文件的多个Block,并发处理。类似于RAID0.

结构:HDFS有两种重要的服务器角色:NameNode(名字服务节点)DataNode(数据存储节点)

NameNode:在整个HDFS中只部署一个实例,提供元数据服务,管理文件名Block(默认64M)的分配,维护整个文件系统的目录树结构,相当于操作系统中的文件分配表(FAT)。

DataNode:部署在HDFS集群中其他所有服务器上,提供真正的数据存储服务。

工作原理:应用程序写文件时,首先访问NameNode,请求分配数据块,NameNode根据管理的DataNode服务器的磁盘空间,按照一定的负载均衡策略,分配若干数据块提供使用。当写完一个数据块时,HDFS将该数据块复制两份存储在其他DataNode服务器上。一旦某台服务器宕机,系统会自动利用其他机器上的数据将这台服务器上存储的数据块自动再备份一份,提高可靠性。

HDFS配合MapReduce等并行计算框架进行大数据处理时,可以在整个集群上并发读写访问所有磁盘。


【参考文献】大型网站技术架构核心原理与案例分析,李智慧,电子工业出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值