前言
本菜鸡之前有过一篇读书笔记,整理了李智慧老师所著的《大型网站技术架构》一书中叙述的五个架构要素。这五个要素分别为 性能、可用性、伸缩性、扩展性、安全性。本文针对性能这一要素进行展开讨论,内容也主要参考自《大型网站技术架构》这本书(一万分推荐这本书,个人认为这本书可以说是技术架构导论一样的存在了)。
性能指标
一、响应时间
指某个请求从发出到接收到响应消耗的时间。
在对响应时间进行测试时,通常采用重复请求的方式,然后计算平均响应时间。
二、吞吐量
指系统在单位时间内可以处理的请求数量,通常使用每秒的请求数来衡量。
吞吐量的几个常用量化指标:
- TPS(每秒事务数)
- QPS(每秒查询数)
- HPS(每秒HTTP请求数)
三、并发数
指系统能同时处理的并发用户请求数量。
在没有并发存在的系统中,请求被顺序执行,此时响应时间为吞吐量的倒数。例如系统支持的吞吐量为 100 req/s,那么平均响应时间应该为 0.01s。
目前的大型系统都支持多线程来处理并发请求,多线程能够提高吞吐量以及缩短响应时间,主要有两个原因:
- 多 CPU
- IO 等待时间
使用 IO 多路复用等方式,系统在等待一个 IO 操作完成的这段时间内不需要被阻塞,可以去处理其它请求。通过将这个等待时间利用起来,使得 CPU 利用率大大提高。
并发用户数不是越高越好,因为如果并发用户数太高,系统来不及处理这么多的请求,会使得过多的请求需要等待,那么响应时间就会大大提高。
性能优化
根据网站分层架构,可分为:
- Web前端性能优化
- 应用服务器性能优化
- 存储服务器性能优化
接下来将对前两种优化手段进行介绍。
Web前端性能优化
一、减少 HTTP 请求
减少 HTTP 请求可有效提高访问性能,手段主要有合并 CSS、合并 JavaScript、合并图片。
二、使用浏览器缓存
CSS、JavaScript、Logo、图标等这些静态文件不需要每次都去执行 HTTP 请求来获得。我们可以将这些文件缓存在浏览器中。通过设置 HTTP 头中 Cache-Contro l和 Expires 的属性,可设定浏览器缓存,缓存时间可以是数天,甚至是几个月。
三、启用压缩
在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量。
四、CSS 放在页面最上面,JavaScript 放在页面最下面
五、减少Cookie传输
因为 Cookie 包含在每次的请求和响应中,太大的 Cookie 会严重影响数据传输,因此要慎重考虑需要写入的 Cookie
六、使用 CDN、反向代理
CDN(Content DIstribute Network),内容分发网络,本质是一个缓存,它将数据缓存在离用户最近的地方(部署在离终端用户最近的网络运营商的机房),使用户以最快速度获取数据,即所谓网络访问第一跳。
反向代理,除了用作负载均衡、保证应用服务器安全性以外,同CDN一样,可以将数据缓存在反向代理服务器上。
无论是使用 CDN 还是反向代理,核心思想都是将常用的请求资源缓存起来,使得 HTTP请求不用到达应用服务器就能得到响应。
应用服务器性能优化
一、使用缓存
缓存能够提高性能的原因如下:
- 缓存数据通常位于内存等介质中,这种介质对于读操作特别快;
- 缓存数据可以位于靠近用户的地理位置上;
- 可以将计算结果进行缓存,从而避免重复计算。
二、使用集群
将多台服务器组成集群,使用负载均衡将请求转发到集群中,避免单一服务器的负载压力过大导致性能降低。
三、使用异步操作
使用消息队列将调用异步化,可改善网站的扩展性,事实上使用消息队列还可以改善网站系统的性能。
某些流程可以将操作转换为消息,将消息发送到消息队列之后立即返回,之后这个操作会被异步处理。用户的响应延迟可以得到有效的改善。
而且消息队列具有很好的削峰作用,它可以将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。在电子商务网站促销活动中,合理的使用消息队列,可有效抵御促销活动刚开始大量涌入的订单对系统造成的影响。