《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

本篇文章是《大型网站技术架构》的笔记,感兴趣可以阅读该书。

瞬时响应之网站的高性能架构

网站性能是客观的指标,可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。同时也是主观的感受,而感受则是一种与具体参与者相关的微妙的东西,用户的感受和工程师的感受不同,不同的用户感受也不同。


一、网站性能测试

性能测试时性能优化的前提和基础,也是性能优化的检查和度量标准。不同视角下的网站性能有不同的标准,也有不同的优化手段


1.1 不同视角下的网站性能

用户、开发人员、运维人员视角各不相同


1.2 性能测试指标

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

  • 响应时间:指应用执行一个操作需要的时间,指从发出请求到最后收到响应数据所需要的时间
    《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
  • 并发数:指系统能够同时处理的请求的数目,这个数字也反映了系统的负载性能。对于网站而言,并发数指网站用户同时提交请求的用户数目。
  • 吞吐量:指单位时间内系统处理的请求数量,体现系统的整体处理能力。
    • TPS (每秒事物数)是吞吐量的一个常用量化指标。
    • HPS(每秒HTTP请求数)
    • QPS (每秒查询数)
  • 性能计数器: 描述服务器或操作系统的一些数据指标。包括System load、对象与线程,CPU使用率、内存使用率、磁盘与网络I/O等

1.3 性能测试方法

性能测试时一个总称、具体可以细分为性能测试、负载测试、压力测试 和稳定测试

  • 性能测试:对系统不断施加压力,验证系统在资源可以接受范围内,是否达到性能 预期
  • 负载测试:对系统不断地增加并发请求以增加系统压力,直到系统的某项或多项性能指标到达安全临界值。如果某种资源已经呈饱和状态,这时继续对系统施加压力,系统的处理能力不但不能提高、反而会下降
  • 压力测试: 超过安全负载的情况,对系统继续施加压力,直到系统崩溃或者不能再处理任何请求,以此获取系统最大压力承受能力
  • 稳定测试:一定条件下,系统运行一段较长时间,检测系统是否稳定。

1.4 性能优化策略

如果性能测试结果不能满足设计或业务需求,那么久需要寻找系统瓶颈,分而治之,逐步优化。根据网站分层架构,可分为Web前端性能优化、应用服务器性能优化、存储服务器性能优化。


1.4.1 Web前端性能优化

一般web前端指业务逻辑之前的部分,包括浏览器加载、网站视图模型、图片服务、CDN服务等。主要优化手段有优化浏览器访问、使用方向代理、CDN

(一)、浏览器访问优化:

  • 减少http请求:因为http是无状态的,每次请求的开销都比较昂贵(需要建立通信链路、进行数据传输,而服务器端对于每个http请求都需要启动独立的线程去处理);减少http的主要手段是合并CSS、合并JS、合并图片(CSS精灵,利用偏移定位image);
  • 使用浏览器缓存:设置http头中Cache-Control和Expires属性;(对不变动的资源做缓存是很有必要的)
  • 启用压缩:可以对html、css、js文件启用Gzip压缩,可以达到较高的压缩效率,但是压缩会对服务器及浏览器产生一定的压力;
  • CSS放页面最上面,JS放页面最下面:浏览器会在下载完全部CSS之后才开始对整个页面进行渲染,因此最好将CSS放在页面最上面;而浏览器在加载JS后会立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此最好将JS放在页面最下面;
  • 减少Cookie传输:一方面,太大的Cookie会严重影响数据传输;另一方面,对于某些静态资源的访问(如CSS、JS等)发送Cookie没有意义,静态资源使用独立域名访问;

(二)、CDN加速:

CDN(内容分发网络)仍然是一个缓存,它将数据缓存在离用户最近的地方,便于用户以最快速度获取数据。即所谓的“网络访问第一跳”,

《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构CDN 能够缓存的一般是静态资源,如图片、文件、CSS、Script脚本、静态网页等,这些文件访问频率很高,将其缓存在CDN可极大改善网页的打开速度


(三)、反向代理
反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构反向代理服务器具有以下功能:

  • 保护网站安全:任何来自Internet的请求都必须先经过代理服务器;

  • 通过配置缓存功能加速Web请求:减轻真实Web服务器的负载压力;

  • 实现负载均衡:均衡地分发请求,平衡集群中各个服务器的负载压力;


1.4.2 应用服务器性能优化

应用服务器就是处理网站业务的服务器,网站的业务代码都部署在这里,是网站开发最复杂,变化最多的地方。主要优化手段有缓存、集群、异步等

(一)、分布式缓存

缓存几乎无所不在,合理使用缓存,对网站性能优化意义重大

网站性能优化第一定律:优先考虑使用缓存优化性能

缓存的基本原理:
缓存是指将数据存储在相对较高访问速度的存储介质中,以供系统处理。

  • 缓存访问速度快,可以减少数据访问的时间
  • 如果缓存的数据时经过计算处理得到,那么缓存还起到减少计算时间的作用

缓存本质是一个内存Hash表,数据缓存以Key,Value形式存储在内存Hash表中。Hash表读取的时间复杂度为O(1)
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
缓存主要用来存放那些读写比很高、很少变化的数据,如商品的类目信息、热门商品信息等。应用程序读取数据时,先到缓存中取,如缓存中没有或失效,再到数据库中取出,重新写入缓存以供下一次访问。因此,可以很好地改善系统性能,提高数据读取速度,降低存储访问压力。

《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

合理使用缓存:

使用缓存对提高系统性能有很多好处,但不合理使用缓存非但不能提高系统的性能,还会成为系统的累赘,甚至风险

  • 频繁修改的数据:不适合
  • 没有热点的 访问:浪费资源
  • 数据不一致与脏读:不能容忍数据不一致不能使用
  • 缓存可用性:缓存服务崩溃的情况如果保障高可用。(热备,分布式缓存)
  • 缓存预热:在启动时加载一些缓存数据
  • 缓存穿透:不恰当的业务、或者恶意攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落在数据库上,会对数据库造成很大压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来。(其中value值为null)

(二)分布式缓存架构

  • JBoss Cache为代表的互相通信派(受限某台服务器大小,同步代价大,所以较少使用);
    《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
  • 以Memcached为代表的互不通信派;(轻易地扩容,具有良好的伸缩性)
    《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

(三)、异步操作

使用消息队列将调用异步化,可改善网站的扩展性,还可改善网站性能
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构消息队列具有削峰的作用—即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构注意提交到消息队列的请求会失败


(四)、使用集群
在网站高并发访问的情况下,使用负载均衡技术为一个应用构建一个由多台服务器组成的集群,将并发访问请求分发到多台服务器上处理。 避免单一服务器负载压力过大而响应缓慢。
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构


(五)、代码优化

  • 多线程
    • 将对象设计为无状态对象
    • 使用局部对象
    • 并发访问资源时使用锁
  • 资源复用
  • 数据结构
  • 垃圾回收

1.4.3 存储服务器性能优化

在网站应用中,海量的数据读写对磁盘访问造成巨大的压力,虽然可以通过Cache解决一部分数据读取压力。但很多时候,磁盘仍然是系统最严重的瓶颈。

  • 机械硬盘 VS 固态硬盘
  • B+树 VS LSM树(目前许多NOSQL产品采用LSM树作为主要数据结构)
    《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

目前大多数DB多采用两级索引的B+树,树的层次最多三层。因此可能需要5次磁盘访问才能更新一条记录(三次磁盘访问获得数据索引及行ID,一次数据文件读操作,一次数据文件写操作)

但是由于每次磁盘访问都是随机的,而传统机械硬盘在数据随机访问时性能较差,每次数据访问都需要多次访问磁盘。从而影响数据访问性能。

《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构

LSM树的原理是:把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会被清除并写入到磁盘中,磁盘中的树定期可以做合并操作,合并成一棵大树,以优化读性能。LSM树的优势在于:在LSM树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+树


  • RAID vs HDFS

RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增加磁盘的可用性和容错性。目前服务器级别的计算机都支持插入多块磁盘,通过使用RAID技术,实现数据在多块磁盘上的并发读写和数据备份。

常用RAID技术有以下几种:
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
HDFS以块(block)为单位管理文件内容,一个文件被分隔成若干个Block。当应用程序写文件时,每写完一个Block,HDFS就将其自动复制到另外两台机器上,保证每个Block有三个副本,即使有两台服务器宕机,数据依然可以访问。
《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构


参考