好刚编程: 网站架构四之高性能【视频】

229 阅读13分钟

你好,我是好刚,再上一节介绍了网站架构的5个要素,了解大型网站架构的衡量标准后,这一节继续学习大型网站技术架构的第四章:网站的高性能架构。

(视频清晰度暂时没有升起来,度盘1uzBdwDAoC7WHI_8jG-bkLA jsir 或者公众号回复关键词“网站架构”可以获取原始视频 )

对网站不同的参入者来说,网站性能有不同的标准,这一节将介绍网站开发者常用的性能指标,测试方法,以及在架构性能不满足业务要求时,常用的优化手段。

1. 网站性能

首先我们解释下对网站的不同参入者来说,网站性能的衡量标准:

  1. 用户:性能是一种主观感受,用户在浏览器上感受到的响应速度,主要指页面内容在前端展示所花的时间,可以通过调整浏览器缓存策略,使用CDN 服务等手段优化。

  2. 开发者:网站性能是指程序本身的性能,包括响应时间,系统吞吐量,并发处理能力等,可以通过缓存,集群,异步等手段改善。

  3. 运维人员:网站性能是指基础设施的能力,比如网络运营商的带宽能力,服务器的硬件配置是否强悍。

1.1 性能指标

对于性能指标,作为网站的开发者,也有很多参数可以衡量网站性能:

  1. 响应时间:它是应用处理一个请求操作需要的时间,包括从发起请求到接收到最后响应数据所需的时间。因为一个请求的响应时间极短,测试时通常是重复请求,比如请求1万次,再用总时间除以总次数,获得单次响应时间。

  2. 并发数:它是系统能够同时处理的请求数目,也指同时提交请求的用户数目。测试时通过多线程模拟用户并发请求。

  3. 吞吐量:它则是单位时间内系统处理的请求数量,对于网站,一般用每秒事务数(TPS) 或者每秒查询数(QPS)来衡量。

吞吐量,并发数与响应时间的关系可以类比高速公路的通行状况:吞吐量是每天通过收费站的车辆数目,并发数是高速公路上的正在行驶的车辆数目,响应时间则是车速。车辆很少时,车速很快,但是通过收费站的车辆数目不多;随着高速公路上车辆数目的增多,车速略受影响,但是通过收费站的数量增加;随着车辆继续增加,车速变得越来越慢,高速公路越来越堵,通过收费站的数量反而降低;如果车流量继续增加,超过某个极限后,任何偶然因素都会导致高速全部瘫痪,车走不动,当然也没有车辆通过收费站。

对应过来就是,在并发数逐渐增大的过程中,吞吐量先逐渐增加,响应时间小幅增加,到达一个极限后,随着并发数的增加,响应时间快速上升,吞吐量开始下降,直到系统崩溃,吞吐量为零,系统失去响应。

1.2 性能测试

性能测试通过不断对系统增加请求压力,以获得系统最大负载能力、最大压力承受能力这些指标的过程。

  1. 在测试开始阶段,随着并发请求数不断升高时,系统使用较少资源就能达到较好的处理能力。网站日常就运行在这个区间,在这个请求压力区间做测试,一般是为了评估系统性能是否满足需求和设计目标。

  2. 请求数继续升高,系统处理能力增加变缓,直到某个临界点处理能力不再增加,这是系统最大负载点。网站运行中,一般出现在因为突发事件导致超出日常访问压力的情况下,这是保证系统正常运行能够承受的最大访问压力。

  3. 请求继续升高,超过最大负载点,机器处理能力会不断下降,并且资源消耗不断增多,直到资源耗尽,这个点是系统的崩溃点。这种将系统测崩溃的测试被称为压力测试,一般是为了评估出可能导致系统崩溃的最大请求压力。

在测试过程中,需要将测试指标和临界值记录起来,整理成测试报告,用于评估系统性能是否满足设计目标和业务要求。

当性能不满足要求时,需要分析用户请求处理的各个环节,检查各个环节的日志,分析那个环节响应时间不合理,定位出现问题的地方。

在定位产生问题的原因后,需要进行性能优化,常见的优化手段有3大类:WEB 前端性能优化,应用服务器性能优化和存储服务器性能优化。

2. WEB 前端性能优化

WEB 前端一般指网站业务逻辑之前的部分,主要是视图渲染和用户交互部分。包括:浏览器内容加载,网站视图,图片服务,CDN服务,主要优化手段有浏览器访问优化,CDN 加速和反向代理。

2.1 浏览器访问优化

  1. 减少HTTP 请求: HTTP 协议是无状态的应用层协议,每次HTTP 请求都需要建立通信链路,进行数据传输,在服务端每次都需要启动独立的线程去处理,而这些通信和服务的开销又比较昂贵。通过减少HTTP 请求数可以提高访问性能。常用的方式合并CSS, js 文件,图片文件。

  2. 使用浏览器缓存: css, js, logo, 图标这些静态资源文件使用频率高,但是更新频率低。可以通过设置缓存标识将它们缓存在浏览器。对于被缓存住的文件,为了能够及时更新,可以设置过期时间自然过期;另一种方式是给文件名增加版本号,当需要更新时直接更新HTML 文件中的引用就可以使用新文件。

  3. 启用文本压缩: html, css, js 都是文本文件,通过压缩可以极大减少通信传输的数据量。但是压缩对服务器和浏览器的性能会有影响,需要权衡考虑。

  4. 规范CSS 和JS 的引用位置: 浏览器在加载完全部css 后才对整个页面进行渲染,因此需要将css 放在页首。js 在加载完成后就立即执行,有可能阻塞页面,所以一般放在页尾。

  5. 减少cookie 传输: 每次请求和响应中都会包含cookie,增加网络传输负担,所以需要减小cookie 大小。对于css, script 这些静态资源,由于发送cookie 没有意义,可以通过启用静态资源域名的方式,避免请求时发送cookie

2.2 CDN 加速

CDN (content distribute network) 是内容分发网络,简单讲就是一个缓存,将数据缓存到离用户最近的地方,使用户能以最快的速度获取数据。

CDN 部署在网络运营商的机房,运营商又是用户的网络服务提供商,因此用户请求第一站就到了CDN 服务器,当CDN 中存在浏览器请求的资源时,会直接返回给浏览器,如果没有,请求再回源到源站获取该资源。

CDN 特别适合缓存图片,css, js, 静态网页这些静态资源,它们的特点是更新频率低但是访问频率高,使用CDN 后可以极大改善网页打开速度。

2.3 反向代理

反向代理服务器位于网站机房一侧,主要负责接收HTTP 请求,分发给后端服务器处理,再将处理结果返回给请求者。

因为所有用户请求必须经过反向代理服务器,可以再这上面配置缓存,将后端服务器处理结果缓存起来,当有其他相同请求命中缓存时,可以直接从反向代理获取数据,加快响应速度。

3. 应用服务器性能优化

介绍完WEB 前端性能优化,继续看应用服务器性能优化。应用服务器是处理网站业务的服务器,也是代码变化最多的地方,优化手段主要有缓存、异步、集群,代码优化。

3.1 缓存

缓存的原理是将数据存储在访问速度相对较高的存储介质中,以供系统处理。一方面缓存访问速度快,可以减少数据访问时间;另外缓存的数据不需重复计算就可以直接返回,减轻应用负载。

缓存一般是一个内存Hash 表,数据以键值对的形式存储在内存Hash 表中。计算Key 的HashCode 就可以快速访问Hash 表中的数据。

实际使用中,对缓存中存储的数据也有一些注意事项:

  1. 缓存的数据不能频繁修改,否则缓存的数据可能还没被使用就变化了,一般来说写入缓存的数据至少要被使用2次以上,缓存才有意义。

  2. 缓存的数据不能没有热点,由于缓存容量有限,不能将所有数据都缓存起来,一般只缓存热点访问的数据,对于访问量不高的数据会及时清理,对于这些访问量不高的数据,没必要放到缓存中。

  3. 缓存数据是可能失效的,缓存的主要目的提高数据读取性能,在访问不到缓存时,应该继续从数据库获取数据。但是因为缓存承担了大部分的数据访问压力,当缓存突然失效时,可能导致数据库压力过高而宕机,进到导致网站不可用,这种情况被称为缓存雪崩。实际中针对这种情况,可以通过缓存热备提高可用性,当一台机器宕机时,可以将访问切到备份服务器上。

  4. 缓存预热,因为缓存中的数据是根据LRU 最近最久未使用算法筛选出来的,筛选过程需要花费很长时间。新启动的缓存服务器在重建这些缓存数据的过程中,对系统性能和数据库负载都是挑战,最好在启动时就把热点数据写入缓存,实现缓存预热。

  5. 缓存穿透:当访问的数据不在缓存中时,请求就会落到数据库上,这种情况被称作缓存穿透。如果有恶意攻击持续高并发地请求不存在的数据,会对数据库造成很大压力,针对这种情况,可以考虑将不存在的数据也缓存起来,这样下次就不会请求数据库了。

3.2 异步操作

异步使用消息队列将调用异步化也可以改善网站性能。

  1. 加快响应速度,在使用消息队列后,用户请求数据发送给消息队列后立即返回,可以极大提高请求响应速度,队列里面的数据则由消费者进程慢慢处理。

  2. 削峰作用,通过将高并发的大量请求直接存入消息队列,可以有效抵御请求流量高峰对系统的冲击。

使用异步时需要注意的是,数据在由后续消费者进程处理时,有可能失败,这时需要适当修改业务流程兼容这种失败情况。

3.3 集群化

为一个应用搭建由多台服务器组成的服务器集群,通过负载均衡转发请求到多台机器上处理,可以有效提升应用处理能力,避免单一服务器因为负载过高导致响应缓慢。

3.4 代码优化

代码层面上,利用编程语言特性优化业务代码:

  1. 使用多线程处理用户并发请求,因为线程更少占用系统资源,切换代价也更小。

  2. 连接复用,像数据库连接,网络通信连接,创建和销毁连接的开销很大,可以使用连接池复用这些连接,只需要在第一次使用时创建,在后续需要使用时从连接池中获取空闲连接使用,用完后归还到连接池即可。

4. 存储性能优化

网站性能优化的第三类手段是存储性能优化。虽然我们在应用服务器上通过使用缓存,解决了一部分数据访问压力,但是数据存储任然是系统中最严重的瓶颈。

  1. 存储介质上,可以用SSD硬盘替代机械硬盘,以加快数据访问速度

  2. 针对存储介质特点,选择合适的数据结构和算法,现在主流的算法有B+树和LSM 树。

  3. 为了增强磁盘的可用性和容错能力,可以使用磁盘阵列技术(RAID),为了存储大量数据,可以引入分布式文件存储系统(HDFS)。

5. 小结

本节介绍了网站开发者常用的性能指标,测试方法,以及在架构性能不能满足业务要求时,如何对web前端,应用服务器和存储服务器进行性能优化。

网站性能问题主要是在用户高并发访问时产生,所以网站性能优化主要是改善高并发用户访问情况下的网站响应速度。在改善网站并发特性的过程中,不可避免带来架构复杂,网络通信延迟等问题,所以最终方案可能是提高并发访问处理能力的同时增加了访问延迟。而对于用户,网站性能最终是一种主观体验,所以有时候也可以通过优化前端交互改善用户体验,让用户感觉快才是目的,毕竟技术最终是为业务服务。

大型网站技术架构的第四章:网站的高性能架构就先介绍到这,这一节也是衡量网站架构设计得好不好的第一个标准,你可能还想继续深入了解网站架构,下一节我将介绍网站架构的第二个衡量标准:高可用。

我是好刚,邀请你关注我的微信公众号:好刚编程,观看下一期的内容。

参考资料

  • 《大型网站技术架构:核心原理与案例分析》 李智慧