您的位置:首页 > 运维架构 > 网站架构

『大型网站技术架构』(二):高性能架构

2016-04-14 12:14 453 查看


『大型网站技术架构』(二):高性能架构


一、不同视角下的网站性能

用户视角

关注点: 关注响应时间,包括浏览器和服务器通信时间 + 服务器处理时间 + 浏览器构造请求和解析响应的时间;

优化手段: 前端架构优化

开发人员视角

关注点: 关注应用及相关子系统性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标;

优化手段: 缓存加速数据读取、集群提高系统吞吐量、异步消息加快请求响应和削峰、代码优化提升性能;

运维人员视角

关注点:关注基础设施性能、资源利用率。

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


二、性能测试指标


1. 响应时间

定义:执行一个应用需要的时间,包括从发出请求开始到收到最后响应数据所需要的时间。反映系统快慢。





图1 常用系统操作响应时间表


2. 并发数

定义:系统能够同时处理请求的数目。反映系统负载特性。

网站系统用户数 >> 网站在线用户数 >> 网站并发用户数


3. 吞吐量

定义: 单位时间内系统处理的请求数量。反映系统的整体处理能力。

单位:TPS每秒事务数,HPS每秒HTTP请求数,QPS每秒查询数

并发数由小增大,服务器资源消耗逐渐增大,吞吐量先增大后下降,直至资源耗尽,吞吐量为零。


4. 性能计数器

定义:描述服务器或操作系统性能的一些数据指标。比如load、对象与线程数、内存、CPU、磁盘/网络IO。


三、性能测试方法


1. 性能测试

以系统设计规划的性能指标为预期目标,验证系统在资源可接受范围内是否能达到性能预期。


2. 负载测试

不断增大并发请求增加系统压力,直到系统某项或多项性能指标达到安全临界值。此时如果继续施压,系统处理能力不升反降。


3. 压力测试

对系统持续加压超过安全负载,直到系统崩溃,以此获得系统最大压力承受能力。


4. 稳定性测试

被测系统在特定硬件、软件、网络环境下,给系统加载一定业务压力,使系统运行一段较长时间,以此检测系统是否稳定。





图2 测试性能曲线

a-b是网站日常运行区间,c是系统最大负载点,d是系统崩溃点。


四、性能优化策略


1. Web前端性能优化

1.1. 浏览器访问优化

减少HTTP请求:合并CSS/JS/图片,sprite技术。

使用浏览器缓存静态资源:Cache-Control、Expires

启用压缩:gzip(文本文件压缩率80%以上)

CSS放在页面最上面(浏览器下载完CSS才开始渲染)、JS放在页面最下面(浏览器加载JS后立即执行,避免某些操作阻塞页面)。

减少Cookie传输:减少Cookie中数据量、为静态资源使用独立域名,避免发送Cookie。

1.2. CDN加速:CDN本质是缓存,将数据(静态资源)缓存在离用户最近的地方。

1.3. 反向代理:缓存静态资源,加速请求响应速度、负载均衡,改善性能、安全


2. 应用服务器性能优化

2.1. 分布式缓存

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

2.1.1. 缓存基本原理:Hash表

2.1.2. 合理使用缓存:

不频繁修改的数据:读写比2:1以上。

有热点的访问:遵循二八定律。

应用能够容忍短期数据不一致和脏读,最终一致。

缓存可用性:防止出现缓存雪崩,即系统性能已经严重依赖缓存,没它不行。

缓存预热: 缓存启动时把热点数据预热(warm up)好。

防止缓存穿透:恶意请求不存在的Key,使请求落到数据库,一个对策是将不存在的数据也缓存起来,令其值为null。

2.1.3. 分布式缓存架构:

需同步更新副本的分布式架构(JBoss Cache)

互不通信的分布式架构(Memcached:简单地通信协议、丰富的客户端程序、高性能网络通信(Libevent、事件触发)、高效的内存管理(slab、chunk)、一致性hash)

2.2. 异步操作

使用消息队列将调用异步化,降低响应延时。

避免高并发请求数据直接落到数据库。

削峰,消除并发访问高峰。

2.3. 使用集群

负载均衡,避免单一服务器压力过大而响应缓慢。


3. 代码优化

3.1. 多线程

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

注意线程安全问题:

将对象设计为无状态:对象无成员变量,在OOP看来是一种不良设计。

使用局部对象。

并发访问资源使用锁。

3.2. 资源复用

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

两种模式:

单例(Singleton): 贫血模式,例如Service、Dao等无状态对象,无需重复创建。(对应有状态的充血模式)

对象池(Object Pool):复用对象实例,减少对象创建和资源消耗,例如连接池、线程池等。

3.3. 数据结构

优化算法

优化数据结构

3.4. 垃圾回收

理解垃圾回收机制,程序优化和参数调优,减少Full GC。

JVM垃圾回收:年轻代+老生代。年轻代包括Eden Space、From、To,进行Young GC;老生代进行Full GC。新对象从Eden Space创建,Eden满了以后YGC,将存活对象复制到From区。当Eden再次满后再次YGC,将Eden和From中的存活对象复制到To。当Eden再次满后再次YGC,将Eden和To中的存活对象复制到From。多次YGC未释放的对象进到老生代,老生代空间满时Full GC。


4. 存储性能优化

4.1. 机械硬盘升级为固态硬盘

4.2. B+树:文件系统或数据库系统通过B+数对数据排序后存储,加快数据检索速度。

4.3. RAID:可通过硬件或者软件实现。

RAID0: 并发读写N块磁盘,速度快,无冗余,数据可靠性低,磁盘利用率100%。

RAID1: 镜像磁盘,访问速度慢,数据可靠性高,磁盘利用率50%。

RAID10: 结合RAID0和RAID1,将磁盘分成2份,互为镜像,同RAID1,每一份磁盘中的数据并发读写。访问速度较快,数据可靠性高,磁盘利用率50%。

RAID3/5/6: 冗余存储校验数据,使少数盘破坏的情况下数据能恢复。访问速度较快,数据可靠性较高,磁盘利用率较高。

--EOF--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: