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


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

  • 用户视角
    关注点: 关注响应时间,包括浏览器和服务器通信时间 + 服务器处理时间 + 浏览器构造请求和解析响应的时间;
    优化手段: 前端架构优化
  • 开发人员视角
    关注点: 关注应用及相关子系统性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标;
    优化手段: 缓存加速数据读取、集群提高系统吞吐量、异步消息加快请求响应和削峰、代码优化提升性能;
  • 运维人员视角
    关注点:关注基础设施性能、资源利用率。
    优化手段: 建设优化骨干网、高性价比定制服务器、利用虚拟化技术优化资源利用率;

二、性能测试指标

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: 冗余存储校验数据,使少数盘破坏的情况下数据能恢复。访问速度较快,数据可靠性较高,磁盘利用率较高。

你可能感兴趣的:(架构设计与分析)