第四章 瞬时响应:网站的高性能架构

内容梳理

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

4.1 网站性能测试

  4.1.1 不同视角下的网站性能

  1. 用户视角下的网站性能

  网站响应速度的快慢,包括用户计算机和服务器通信的时间、网站服务器处理的时间、用户计算机浏览器构造请求和解析响应数据的时间。

  

  通过前端手段优化来改善用户视角下的网站性能。

  2. 开发人员视角下的网站性能

  关注程序本身及相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等。

  通过使用缓存、集群、异步消息、代码优化来改善性能。

  3. 运维人员视角下的网站性能

  关注基础设施性能和资源利用率。

  通过建设优化骨干网、使用性价比高的定制服务器、利用虚拟化技术等优化资源利用。

  4.1.2 性能测试指标

  1. 响应时间

  执行一个操作需要的时间,从发出请求开始到收到最后响应数据所需要的时间。测试程序通过模拟应用程序,记录收到相应和发出请求的时间差来计算系统响应时间。

  2. 并发数

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

  3. 吞吐量

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

  4. 性能计数器

  描述服务器或操作系统性能的一些指标,包括System Load、对象与线程数、内存使用、CPU使用、磁盘和网络I/O等指标。

  4.1.3 性能测试方法

  1. 性能测试

  验证资源在可接受范围内,是否能达到系统性能预期。

  2. 负载测试

  不断增加系统压力,直到系统某项或多项指标达到安全临界值。

  3. 压力测试

  超过安全负载情况下,继续增加系统压力,直到系统崩溃或不能再处理任何请求,获得系统最大承受压力。

  4. 稳定性测试

  给系统加载一定业务压力,检测系统是否能够较长时间稳定运行。

  系统性能测试遵循抛物线规律。

  

  性能测试反映的是系统在实际生产环境中使用时,随着用户并发访问数量的增加,系统的处理能力。

  

  4.1.4 性能测试报告

  反映测试曲线上的规律。

  4.1.5 性能优化策略

  1. 性能分析

  分析请求经历的各个环节,排查可能出现瓶颈的地方,定位问题。

  2. 性能优化

  针对特定问题进行优化,主要有Web前端性能优化、应用服务器性能优化、存储服务器性能优化三大类。  

4.2 Web前端性能优化

  在网站业务逻辑之前,包括浏览器加载、网站视图模型、图片服务、CDN服务等,主要优化手段有优化浏览器访问、使用反向代理、CDN等。

  4.2.1 浏览器访问优化  

   1. 减少http请求

  服务器端需要启用独立线程处理http请求,将浏览器一次访问需要的JS、CSS等合并成一个文件,只需要一次请求完成访问。

   2. 使用浏览器缓存

  将更新频率低的静态资源缓存在客户端浏览器。

   3. 启用压缩

  服务器中对文件压缩,客户端浏览器解压缩。

   4. CSS放在页面最上面,IS放在页面最下面

  下载完全部CSS再渲染页面,浏览器加载JS后立即执行。

   5. 减少Cookie传输

  太大Cookie影响数据传输。  

  4.2.2 CDN加速

  

  将静态数据缓存在离用户最近的网络运营商机房中,以最快速度在网络访问第一跳中获取数据。

  4.2.3 反向代理

  

  反向代理服务器位于网站机房一侧,代理网站Web服务器接收http请求加速请求响应。还可以保护浏览器安全,在web服务器和可能的网络攻击之间建立屏障,还有实现负载均衡的功能。  

4.3 应用服务器性能优化

  处理网站业务的服务器,是网站开发最复杂、变化最多的地方。

  4.3.1 分布式缓存

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

  1. 缓存的基本原理

  将数据存储在相对较高访问速度的存储介质中,以供系统处理。主要存储读写比很高、很少变化的数据。

  

   2. 合理使用缓存

  不要滥用缓存。可能出现的问题有频繁修改的数据、没有热点的访问、数据不一致与脏读、缓存可用性、缓存预热、缓存穿透等。

   3. 分布式缓存架构

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

  JBoss Cache的分布式缓存集群中所有服务器中保存相同缓存数据,当某台服务器中有缓存更新是,通知其他服务器更新缓存或清除缓存数据。

   4. Memcached

  是一种有着简单的通信协议、丰富的客户端程序、高性能的网络通信、高效的内存管理、互不通信的服务器集群架构。   

  4.3.2 异步操作

  使用消息队列将调用异步化,改善网站的扩展性,削平高峰期的并发事务。

  数据写入消息队列后立即返回给用户,后续的业务校验、数据库操作等可能失败,所以需要修改业务流程来配合。

  “任何可以晚点做的事情都应该晚点再做。”

  4.3.3 使用集群

  使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单一服务器因负载压力过大而响应缓慢。

  4.3.4 代码优化  

  1. 多线程

  从资源利用角度看,IO阻塞和多CPU是使用多线程的主要原因。

  启动线程数 = [ 任务执行时间 /( 任务执行时间 - IO等待时间 )] * CPU内核数 

  需要关注多线程安全问题,解决多线程安全的主要手段有:(1)将对象设计为无状态对象;(2)使用局部对象;(3)并发访问资源时使用锁。

   2. 资源复用

  减少开销很大的系统资源的创建和销毁,资源复用的两种模式:单例和对象池。

   3. 数据结构

  灵活组合各种数据结构改善数据读写和计算特性优化程序性能。

   4. 垃圾回收

  理解垃圾回收机制,编写内存安全的代码。

4.4 存储性能优化

  4.4.1 机械硬盘 vs 固态硬盘

  机械硬盘在数据连续访问时效率高,在随机访问时效率低。固态硬盘随机访问效率高。

  4.4.2 B+树 vs LSM树

  对数据先排序后存储,加快检索速度。传统关系型数据库使用B+树,非关系型NoSQL使用LSM树。作为存储结构,B+树不是关系型数据库独有的,NoSQL数据库也可使用B+树,关系型数据库也可使用LSM树。

  4.4.3 RAID vs HDFS

  RAID(廉价磁盘冗余阵列)技术改善磁盘的访问延迟,增强磁盘的可用性和容错能力。主要有RAID0、RAID1、RAI/10、RAID5、RAID6等类型。

  HDFS以块(Block)为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,每写完一个Block,HDFS就将其自动复制到另外两台机器上,保证每个Block有两个副本。对文件进行处理计算时,使用MapReduce并发计算任务框架。

本章结构

 

posted @ 2018-12-27 10:36  阿豆豆  阅读(222)  评论(0编辑  收藏  举报