《大型网络技术架构》笔记 2

来源:互联网 发布:手机打网络电话软件 编辑:程序博客网 时间:2024/05/18 16:35

第四章、网站的高性能架构

4.1 网站性能测试

4.1.2性能测试指标

响应时间、并发数、吞吐量(TPS每秒事务数),分别可以形容为高速公路的车速、公路的车数、通过收费站的车数。车少则速快收费低,车略多则速略低收费高、车很多则路堵费用收不上!

性能计数器:System Load 、对象与线程数、内存、CPU、磁盘网络、IO等。

4.1.3性能测试方法

性能测试:以设计初期规化性能指标为预期,在资源可接受范围内是否达到预期。

负载测试:增加并发加大压力至到安全临界值(饱和状态),继续施加压力则降低性能。

压力测试:施加压力直到系统崩溃。获得系统最大承受能力。

稳定性测试:在特定软件、硬件、网络条件下加载业务压力。


4.1.4 性能优化策略

性能分析:找出瓶颈

性能优化:前端、应用服务器、存储服务器


4.2 Web前端性能优化

4.2.1浏览器访问优化

减少http请求主要手段:合并CSS、JavaScrip、合并图片。将浏览器一次访问需要的CSS、JavaScip合并为一个文件,这样只需要一个请求。通过CSS偏移响应鼠标点击操作,构造不同URL(不解)

使用浏览器缓存:放置静态文件(CSS javaScrip Logo, 图标。设置http头的 Cache-Control和Expires属性设定缓存及天数。静态文件变化响应至客户端通过改名(javascrip)并更新HTML的引用。更改静态资源要一点一点改动以免(用户大量更新缓存)增加服务器负载造成堵塞。

启用压缩:文本文件压缩率达80%以上HTML CSS等使用GZip达到较好效果。(当然,这是牺牲服务器与客户浏览器资源为代价换取网络优良传输的)

CSS放在页面最上面、javascrip放在最下面:浏览器在读完CSS之后对页面进行渲染。浏览器加载javascrip会立即执行将造成页面堵塞。(当然,如要要提前解析的javascrip还是要放在前面的)

减少Cookie传输:静态资源可采用独立域名访问,避免请求静态资源访问Cookie.(存疑)

4.2.2 CDN加速:将缓存放得离用户近点。

4.2.3 反向代理

除了安全的作用外,它当然也可以放缓存。


4.3 应用服务器性能优化

4.3.1分布式缓存

缓存基本原理:将数据以Hash表形式存在内存中以达到快速读取(更新数据会出现延迟脏读)

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

当缓存服务器崩溃时,数据库会因承受不了压力而宕机。——缓存雪崩(缓存是不可靠的数据源)

缓存预热:在缓存系统启动时把热点数据加载好。(预加载)

缓存穿透:如果有人恶意高并发请求不存在的数据(当然不会写在缓存),数据库可能会崩溃。对策:将不存在的数据也缓存起来(value值为null)

分布式缓存架构:以集群方式提供缓存服务。架构方式两种,一种以JBoss Cache为代表需要更新同步的分布式缓存,一种以Memcached为代表的不互相通信的分布式缓存。

通信协议:TCP/UDP ,HTTP。一种是通信序列化协议,使用数据两端都可识别的数据序列传输。(如:XML ,JISON)。Memcached使用TCP/UDP。NoSql产品对其支持。

只要支持TCP协议的客户端都可以和Memcached服务器进行通信——支持丰富的客户端程序(支持几乎所有主流语言)。

Memcached 服务端通信模块基于Libevent。一个支持事件触发的网络程序通信库。(优于稳定的长连接)

高效内存管理:——内存碎片管理。Memcache使用固定空间分分配,从面避免内存碎片。存储数据时根据数据的Size大小,寻找一个大于Size的最小chunk将数据写入。内存的分配与释放都以chunk为单位。和其他缓存一样,Memcached会释放久未使用的chunk块(缺点:chunk参数配置不合理,浪费资源特别大!)


互不通信服务器集群架构:Memcached为代表,可以做到无限制的线性伸缩——大数据技术架构特点。

4.3.2 异步操作

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

由于消息队列服务器处理速度远大于数据库,所以可以从消息队列中获取数据异步写入数据库。(减轻数据库服务器压力,改善用户响应延迟)可应用于解决高并发问题。

当然,使用消息队列将会导致晚点!例如:可能用户够买了商品(获得了响应)但实际数据库没写进去(校验等出问题)。所以要作出相应的业务流程,以免产生经济纠纷。

4.4 使用集群

使用负载均衡技术,参考性能测试曲线,使服务器并发数目(总数/集群服务器数)控制在最佳运行区间。

4.3.4 代码优化

1 多线程

由于线程比进程占用资源少,更轻量,所以Web应用采用多线程的方式响应用户请求。为了使CUP的利用率高,也需要使用多线程(当IO处理的时候,它的时间花费要比CPU高很多,CPU于是可以调度处理其它线程。)启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CUP内核数.

解决线程安全的主要手段有如下几点。

将对象设计为无状态对象:对象本身不存储状态信息(对象无成员变量,或者成员变量也是无状态对象)。Servlet对象就是无状态对象。

使用局部对象:在方法内部创建对象。

并发访问资源时使用锁:使并发操作转化为顺序操作。但是锁导致线程同步顺序执行,可能对系统性能产生严重影响。

2 资源利用

尽量减少那些开销大的系统资源创建销毁,如:数据库连接、网络通信连接、线程、复杂对象。从编程角度,资源复用主要有两种模式:单例和对象池。Servlet Dao即单例,线程池和连接池即对象池。

3 数据结构

由于缓存用到Hash表,所以hashCode越随机散列、hash冲突越少,读写性能越高。目前好的字符串算法为Time33算法:

hash(i) = hash(i-1)*33 + str[i]。当然,即使再好的算法也会有冲突。可行的方案是对字符串取信息指纹,再对信息指纹求HashCode。由于字符串微小的变化就可引起巨大不同因此得到较好的随机散列。

4 垃圾回收

4.4 存储性能优化

4.41 固态硬盘与机械硬盘

固态硬盘(SSD)可以将数据存储在晶体硅里面,类似于内存可以随机访问。(更少的噪音与开销)

4.42 B+树 VS LSM树


B+树是一种专门针对磁盘存储而优化的N叉排序树,以树节点为单位存储在磁盘中,从根开始查找所需数据所在的节点编号和有磁盘位置,将其加载到内存中后然后继续查找,直到找到所需的数据。

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

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

LSM树对数据的操作在内存中完成速度远快于B+树

4.4.3 RAID VS HDFS

RAID(廉价磁盘冗余阵列)主要是为了改善磁盘访问延迟,增强磁盘的可用性和容错能力。

HDFS以块为单位管理文件内容,一个文件被分割成若干个Block,当应用程序写文件时,每写完一个Block,HDFS就将其自动复制到另外两台机器上,保证每个Block有三个副本,即使两台服务器宕机,数据依然可以访问。

当对文件时行处理计算时,通过MapReduce并发计算任务框架,可以启动多个计算子任务,同时读取文件的多个Block,并发处理。

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


0 0
原创粉丝点击