大型网站技术架构 – 第四节读书笔记

  • 2018-07-24
  • 0
  • 0

作者:黄志成

博客:地址

瞬时响应:网站高性能架构

开篇就抛出一个问题. 什么叫高性能的网站?

网站前端性能

从用户角度.能在最快的时间内响应数据那就是性能好.客户端是用户能接触到的.不同计算机性能差异,不同浏览器解析html速度的差异,不同运营商提供宽度的差异,这些差异会远远大于网站服务器处理请求需要的时间.

在实践中,使用一些前端优化手段,可以提高性能:

下面给大家列出雅虎前端优化的35条军规

1. [内容]尽量减少HTTP请求数
2. [服务器]使用CDN(Content Delivery Network)
3. [服务器]添上Expires或者Cache-Control HTTP头
4. [服务器]Gzip组件
5. [css]把样式表放在顶部
6. [js]把脚本放在底部
7. [css]避免使用CSS表达式
8. [js, css]把JavaScript和CSS放到外面
9. [内容]减少DNS查找
10. [js, css]压缩JavaScript和CSS
11. [内容]避免重定向
12. [js]去除重复脚本
13. [服务器]配置ETags
14. [内容]让Ajax可缓存
15. [服务器]尽早清空缓冲区
16. [服务器]对Ajax用GET请求
17. [内容]延迟加载组件
18. [内容]预加载组件
19. [内容]减少DOM元素的数量
20. [内容]跨域分离组件
21. [内容]尽量少用iframe
22. [内容]杜绝404
23. [cookie]给Cookie减肥
24. [cookie]把组件放在不含cookie的域下
25. [js]尽量减少DOM访问
26. [js]用智能的事件处理器
27. [css]选择舍弃@import
28. [css]避免使用滤镜
29. [图片]优化图片
30. [图片]优化CSS Sprite
31. [图片]不要用HTML缩放图片
32. [图片]用小的可缓存的favicon.ico(P.S. 收藏夹图标)
33. [移动端]保证所有组件都小于25K
34. [移动端]把组件打包到一个复合文档里
35. [服务器]避免图片src属性为空

这里为了减少本篇幅字数,就不对上述35条进行细说了.

网站后端性能

开发人员关注的主要是应用程序本身及其相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等相关指标.

当然还有我们的运维人员,他们更关注基础设施性能和资源利用率,如网络运营商的宽带能力、服务器硬件配置、数据中心网络架构、服务器和网络宽带的资源利用率。主要优化手段有建设优化骨干网、使用高性价比定制服务器、利用虚拟化技术优化资源利用。

性能测试指标

不同视角下有不同的性能标准,不同标准有不同的性能测试指标,从开发和测试人员的视角,网站性能测试的主要指标有 响应时间、并发数、吞吐量、性能计数器

  • 响应时间

指应用执行一个操作的时间,包括从发出请求开始到最后响应数据所需要的时间。响应时间是系统最重要的指标,直观反映了系统的“快慢”.

那如何计算出一个网站的响应时间呢?

我们可以对一个请求操作模拟重复执行一万次,测试一万次执行需要的总响应时间之和,然后除以一万,得到单次请求响应时间.

  • 并发数

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

  • 吞吐量

指单位时间内系统处理的请求数量,体现系统整体处理能力。对于网站,可以用“请求数/秒”或是“页面数/秒”来衡量,也可以用“访问人数/天”或是“处理的业务数/小时”等来衡量

TPS(每秒事务数)是吞吐量的一个常用量化标准,此外还有HPS(每秒HTTP请求数)、QPS(每秒查询数)

在系统并发数由小增大的时候,系统的吞吐先是逐渐增加,达到一个极限后,随着并发数增加反而下降,达到崩溃点后,系统资源耗尽,吞吐量为零。

网站性能优化的目的,除了改善用户体验的响应时间,还要提高系统吞吐量,最大限度利用服务器资源。

  • 性能计数器

它是描述服务器或操作系统性能的一些数据。包括System Load(系统负载)、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等指标。这些指标也是系统监控的重要参数,对这些指标设置报警阈值,当监控系统发现性能计数器超过阈值,就向运维和开发人员报警.

性能测试方法

性能测试是一个总称,具体可细分为性能测试、负载测试、压力测试、稳定性测试

  • 性能测试

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

  • 负载测试

对系统不断增加并发请求以增加系统压力,直到系统的某项或者多项性能指标达到安全临界值,如某资源已经饱和状态,这时继续对系统施加压力,系统处理能力不但不能提高,反而下降。

  • 压力测试

超过安全负载情况下,对系统继续施加压力,知道系统崩溃不能再处理任何请求,以此获得最大承受压力.

  • 稳定性测试

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

性能优化策略

如果性能测试结果不能满足业务需求,那么就要寻找系统瓶颈,分而治之,逐步优化。

大型网站结构复杂,用户从浏览器发出请求直到数据库完成操作事务,中间需要经历很多环节,如果测试或者用户报告网站响应缓慢,存在性能问题,必须对请求经历的各个环节进行分析.

排查一个网站性能瓶颈的手法:检查请求处理各个环节的日志,分析哪个环节响应时间不合理、超过预期;然后检查监控数据,分析影响性能的主要因素是内存、磁盘、网络还是CPU, 是代码架构设计不合理或者系统资源确实不足.

下面说说应用服务器优化的一些方案吧.

应用服务器性能优化

应用服务器就是处理网站业务的服务器,网站的业务代码都部署在这里,是网站开发最复杂,变化最多的地方,优化手段有缓存、集群、异步等。

分布式缓存

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

当网站性能遇到瓶颈的时候,第一个想到的方法就是使用缓存.在整个网站应用中,缓存无处不在.既可以在于浏览器也可以在于应用服务器和数据库服务器.

缓存指将数据存储在相对较高访问速度的存储介质中,以供系统处理。一方面可以减少访问速度,另一方面,如果缓存是通过计算获得的,可以重复使用。

缓存的本质是一个内存Hash表,网站应用中,数据缓存存以一对Key Value。Hash表数据读写时间复杂度为O(1)。

缓存主要存储那些读写比很高、很少变化的数据,如商品类目信息,热门词搜索列表,热门商品信息。

image

用户通过浏览器访问我们服务器 我们服务器首先判断数据有没有存在缓存当中,如果存在直接从缓存当前获取数据,如果不存在 即 从我们的数据库中读取,然后再加入到我们的缓存系统当中.

网站的数据遵循二八定律,即80%的访问落在20%的数据上,我们将这20%的数据缓存起来,可以很好改善系统性能.

当然缓存也不是万金油.如果过早的使用,可能很多问题会被缓存给掩盖.当日后重构的时候,会发现更大的坑。

缓存使用不当也会出现很多问题.比如

  • 缓存穿透

我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。

  • 缓存并发

有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

  • 缓存雪崩

当缓存同一时刻过期,会将所有的查询压力继续施压到DB上面了.

  • 数据不一致

数据库修改成功了,而缓存没有删除.这样就变成了脏数据了.

这里只是抛出了问题.之后会专门做一篇文章来记录解决这些问题的一些方案.

异步

任何可以晚点做的事情都应该晚点再做.

使用消息队列调用异步化,可以改善网站的扩展性.

image

在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况会对数据库造成巨大的压力,同时影响响应时间变长.在使用消息队列后,用户请求的数据发送给消息队列后会立马返回.

目前在初期可以通过 Redis 的List实现简单队列.

后面随着业务增长和严谨性可以使用更专业的软件: Kafka、RocketMQ、RabbitMQ、ZeroMQ、Beanstalkd

使用集群

在网站高并发的场景下,使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器.避免单一服务器压力过大.

负载均衡可以通过硬件或软件实现,硬件效果更好,成本会更大.

硬件的有 F5、A10

软件的有 LVS、Nginx

代码优化

  • 多线程

经常会有一个问题,一台服务器启动多少线程合适?假设服务器上执行的都是相同类型的任务有个简化的公式:

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

解决线程安全的手段

  1. 将对象设计为无状态对象
  2. 对象本身不存储状态信息(对象无成员变量,或者成员变量也是无状态对象),例如贫血模型对象,但与面向对象思想相悖
  3. 使用局部对象
    方法内部创建对象,除非程序员刻意传递,一般不会出现对象被多线程并发访问的情形
  4. 并发访问资源时使用锁
    通过锁的方式将多线程并发操作转化为顺序操作,尽可能使用轻量级锁,注意对系统性能造成的影响
  • 资源复用

尽可能减少开销大的系统资源的创建和销毁
数据库连接、网络通信连接、线程、复杂对象等

数据库连接频繁创建耗费资源和时间,采用使用归还的连接池形式,线程池的机制也类似

  • 数据结构

程序 = 算法 + 数据结构

不同场景中合理使用恰当的数据结构,灵活组合各种数据结构可极大优化程序的性能

  • 垃圾回收

将不需要的变量即时销毁.可以提升性能.

小结

网站性能优化技术是在网站性能遇到问题时的解决方案.网站性能对最终用户而言是一种主观感受,性能优化的最终目的就是改善用户的体验,使他们感觉网站很快,离开这个目的,追求技术上所谓高性能,是舍本逐末,没有多大意义。

归根到底,技术是为业务服务的,技术选型和架构决策依赖业务规划乃至企业战略规划,离开业务发展的支持和驱动,技术走不远,甚至会迷路。

评论

还没有任何评论,你来说两句吧