大型网站技术架构笔记-第2篇 架构(4)

来源:互联网 发布:淘宝手机端详情页模板 编辑:程序博客网 时间:2024/06/04 23:22
瞬时响应:网站的高性能架构

4.1 网站性能测试

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

4.1.1 不同视角下的网站性能

用户视角:网站的响应速度快还是慢。

开发人员:

响应延迟、系统吞吐量、并发处理能力、系统稳定性等指标。

优化手段:缓冲加速、集群提高吞吐量、异步消息加快请求响应及实现消峰、代码优化改善程序性能

运维人员:

网络运营上的带宽能力、服务器硬件配置、数据中心网络架构、服务器和网络带宽的资源利用率

优化手段:架设优化骨干网、使用高性价比定制服务器、利用虚拟化技术优化资源利用

4.1.2 性能测试指标

1.响应时间 

操    作

响应时间

打开一个网站

几秒

在数据库中查询一条记录(有索引)

十几毫秒

机械磁盘一次寻址定位

4毫秒

从机械磁盘顺序读取1MB数据

2毫秒

从SSD磁盘顺序读取1MB数据

0.3毫秒

从远程分布式缓存Redis读取一个数据

0.5毫秒

从内存中读取1MB数据

十几微秒

Java程序本地方法调用

几微秒

网络传输2KB数据

1微秒

2.并发数

系统能够同时处理请求的数目,同时也反映了系统的负载特性。网站并发数即网站并发用户数,指同时提交请求的用户数量

测试程序通过多线程模拟并发用户的办法来测试系统的并发能力,为真实模拟用户行为,测试程序并不是启动多线程然后不停地发送请求,而是在两次请求之间加入一个随机等待的时间,这个时间被称作是思考时间

3.吞吐量

单位时间内系统处理的请求数量,体现系统的整体处理能力。网站可以使用“请求数/秒数”、“页面数/秒数”、TPS(每秒事务数)、HPS(每秒HTTP数)、QPS(每秒查询数)等

系统的并发数由小到大的过程中,系统的吞吐量先是增加,达到一个极限后,随着并发数的增加反而下降,达到系统崩溃点后,系统资源耗尽、吞吐量为0

4.性能计数器

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

系统负载:当前正在被CPU执行和等待被CPU执行的进程数目总和,是反映系统忙闲程度的重要指标

多核CPU,完美的情况,所有cpu都在使用,没有进程在等待处理,所以load 的理想值是CPU的数目

top 命令查看该值的三个浮点数(百分比),表示最近1分钟,5分钟,15分钟的运行队列平均进程数

4.1.3 性能测试方法

性能测试

负载测试

压力测试

稳定性测试


4.2 Web前端性能优化

4.2.1 浏览器优化

减少http请求

使用浏览器缓存

启用压缩

css放在页面最上面、js 放在页面最下面

减少cookie 传输

4.2.2 CDN加速

4.2.3 反向代理


4.3 应用服务性能优化

4.3.1分布式缓存

网站遇到性能瓶颈时,优先考虑使用缓存

1、缓存的基本原理:将数据存储在相对较高访问速度的存储介质上,以供系统处理。缓存访问速度快,可减少数据访问的时间,另一方面,经过计算处理得到的数据,无需重复计算即可直接使用

缓存的本质是一个内存的Hash 表,时间复杂度O(1)。

2、合理使用缓存:频繁修改的数据、没有热点的访问、数据不一致与脏读(设置过期时间)、缓存可用性(缓存雪崩)、缓存预热、缓存穿透

3、分布式缓存架构

JBoss cache 需要更新同步

Memcached 使用集中式的缓存集群管理,互不通信的分布式架构。缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据。

4、Memcached

通信协议:TCP、UDP

多语言客户端:Java、C、Perl、Python、PHP、Ruby

服务端基于Libevent,支持事件触发的网络通信程序库

内存管理:固定空间分配,将内存空间分为一组slab,每个slab里又包含一组chunk,同一个slab里的每个chunk的大小是固定的,拥有相同大小chunk的slab 被组织在一起,叫做slab_class

slab_class —>slab—>chunk(依次包含)

存储数据时,根据数据大小,寻找一个大于Size的最小chunk将数据写入。内存的分配和释放都是以chunk为单位。采用LRU,算法释放最近最久未被访问的数据占用空间,释放的chunk被标记为未用

4.3.2异步操作

使用消息队列,用户的请求数据发送给消息队列后立即返回,再由消息队列的消费者进程,从消息队列中获取数据,异步写入数据库。

消息队列具有良好的削峰作用,通过异步处理,削平高峰期的并发事务。对消息队列后续处理中,可能存在的失败情况,设计中考虑返回

4.3.3 使用集群

使用负载均衡服务器进行请求转发

4.3.4 代码优化

1.多线程

IO阻塞和多CPU。当前线程进行IO处理的时候,会被阻塞释放CPU以及等待IO操作完成,由于IO操作通常需要较长是家,这时CPU可以调度其他的线程进行处理。利用线程IO阻塞和执行交替进行,最大限度利用CPU资源。多核CPU,多线程,利用更充分

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

最佳启动线程数和CPU核数成正比,和IO阻塞时间成反比。线程数如果超过CPU,CPU也来不及调度;启动多线程,有助于提高任务并发度,提供系统的吞吐能力,改善系统性能

线程安全

将对象设计为无状态对象

使用局部对象

并发访问资源时使用锁

2.资源复用

系统运行时,尽力减少开销很大的系统资源的创建和销毁,比如数据库链接、网络通信链接、线程、复杂对象等。从编程角度,资源复用重要的两种模式:单例和对象池。

3.数据结构

4.垃圾回收

4.4 存储性能优化

HDFS Hadoop分布式文件系统





原创粉丝点击