《构建高性能Web站点》第一章 绪论

1.网络上数据传输时间

主要可以分为三个部分:
1.数据在网络上传输的时间(来回两个过程)
2.站点服务器处理请求并生成回应数据的时间
3.浏览器本地计算和渲染的时间

2.带宽、吞吐率

带宽是指信道的理论最大数据传输速率,单位也为Mbps;

每秒处理请求数,也称吞吐率,吞吐率不是指单位时间处理的数据量,而是请求数。

带宽是说的是最大值速率,吞吐量说的是某时刻速率。但吞吐量不能超过最大速率。

影响服务器吞吐率的因素非常多,比如服务器的并发策略、I/O模型、I/O性能、CPU核数等,当然也包括程序本身的逻辑复杂的。

3.浏览器本地计算和渲染

浏览器本地计算和渲染的时间自然消耗在浏览器端,它依赖的因素包括浏览器采用的并发策略、样式渲染方式、脚本解释器的性能、页面大小、页面组件的数量、页面组件缓存状况、页面组件域名分布以及域名DNS解析等,并且其中一些因素随着各厂商浏览器版本的不同而略有变化。

4.性能瓶颈

我们除了要关注真正影响性能的主要因素,同时,在这些关键因素的背后,也存在很多不能忽略的子因素,构成了性能优化的“长尾效应”,也就是说如果你对某个子因素背后的问题进行优化,可能会带来性能上的少许提升,也许不被察觉,但是多个子因素的优化结果也许会叠加在一起,带来性能上可观的提升。

5.减少网页中的HTTP请求

● 设计更加简单的网页,使其包含较少的图片和脚本,但是这可能牺牲了美观和用户交互。
● 将多个图片合并为一个文件,利用CSS背景图片的偏移技术呈现在网页中,避免了多个图片的下载。
● 合并JavaScript脚本或者CSS样式表。
● 充分利用HTTP中的浏览器端Cache策略,减少重复下载。

等等

6.静态缓存和动态缓存

静态缓存:是在新内容发布的同时就立刻生成相应内容的静态页面,比如:2003年3月22日,管理员通过后台内容管理界面录入一篇文章后,就立刻生成http://www.chedong.com/tech/2003/03/22/001.html这个静态页面,并同步更新相关索引页上的链接。
  
动态缓存:是在新内容发布以后,并不预先生成相应的静态页面,直到对相应内容发出请求时,如果前台缓存服务器找不到相应缓存,就向后台内容管理服务器发出请求,后台系统会生成相应内容的静态页面,用户第一次访问页面时可能会慢一点,但是以后就是直接访问缓存了。

静态缓存技术

说起静态缓存技术,CDN是经典代表之作。静态缓存技术面非常广,涉及的开源技术包含apache、Lighttpd、nginx、varnish、squid等。

静态缓存,一般指 web 类应用中,将图片、js、css、视频、html等静态文件/资源通过磁盘/内存等缓存方式,提高资源响应方式,减少服务器压力/资源开销的一门缓存技术。

静态缓存方式:浏览器缓存、磁盘缓存、内存缓存、nginx的内存缓存、CDN

浏览器缓存,也称为客户端缓存,是静态缓存中最常见最直接的表现形式,很多时候都往往被人忽略掉。

除了存储在客户端的静态缓存(浏览器静态)技术外,在服务器端的静态缓存技术主要分为磁盘缓存和内存缓存两大类。单纯围绕 nginx 的 squid、varnish 等一类中间件,处理静态数据的性能十分优秀。核心是 nginx 基于 epoll 网络模型,而相比 apache 基于 select 网络模型。所以 apache 的优势在于密计算型,稳定性好。而 nginx 偏向静态处理,反向代理,高并发。比如 apache+php 的稳定性比 nginx+php 要好,而性能是明显 nginx 要优秀许多。以上仅单纯是对磁盘中静态数据处理的能力,所谓磁盘缓存,指另外的一种缓存静态文件的技术。

紧接上面描述的磁盘缓存,内存缓存顾名思义,就是把静态文件缓存在服务器端的内存中。所以这种缓存,如若命中缓存的话,取内存中的缓存数据返回比取磁盘中的缓存数据返回,性能要高很多。

其实 nginx 也有内存缓存,相比 squid、varnish 而言,nginx 的内存缓存需要通过编码实现。Nginx的内存缓存因为需要通过编码实现,所以灵活性特别高。这块可以结合自身业务系统的特点,让静态缓存的灵活性和效率都能得到保障。可能唯一的缺陷就是,通过编码实现的方式,给我们维护管理带来了负担。

说起 CDN,大家都不陌生,它是静态缓存加速最典型的代表。CDN技术并不是一门新的技术,它是基于传统 nginx、squid、varnish 等 web 缓存技术,结合 DNS 智能解析的静态缓存加速技术。值得注意的是,他对动态链接访问并没有加速效果。

架构原理图如下:
在这里插入图片描述
所以CDN的静态缓存技术核心主要在于两点:

1.节点缓存:对需要加速的网站应用,相应的静态资源通过内存缓存+磁盘缓存的方式缓存在服务器端。
2.精准调度:【对访问的用户 ip 进行智能解析调度,实现就近缓存节点访问】。比如以上图例中,北京用户访问 www.a.com。通过 dns 解析的时候,分析用户 ip,发现是北京用户。则 dns 返回对应北京缓存节点的 ip 地址给到用户,则用户 www.a.com 默认访问北京服务器上面的缓存数据,【实现就近访问的策略,大大提升了访问速度。】

参考文章:
https://blog.csdn.net/GitzLiu/article/details/74421882
https://blog.csdn.net/qq_21956483/article/details/78720345

数据库缓存、静态缓存、动态缓存

数据库缓存:

我们知道常见的数据库,比如oracle、mysql等,数据都是存放在磁盘中。虽然在数据库层也做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,而且粒度也太小,一般只有表中数据没有变更的时候,数据库对应的cache才发挥了作用。但这并不能减少业务系统对数据库产生的增、删、查、改的庞大IO压力。所以数据库缓存技术在此诞生,实现热点数据的高速缓存,提高应用的响应速度,极大缓解后端数据库的压力。

动态内容缓存是将数据和表现整体打包,一步到位,但就像快餐店里的组合套餐一样,有时候未必完全合乎我们的口味。当我们意识到在自己的站点中,某些动态内容的计算时间其实主要消耗在一些烦人的特殊数据上,这些数据或者更新过于频繁,或者消耗大量的I/O等待时间,比如对关系数据库中某字段的频繁更新和读取,这时我们为了提高缓存的灵活性和命中率,以及性能的要求,便开始考虑数据缓存。

更加细粒度的数据缓存避免了过期时大量相关网页的整体更新,比如很多动态内容都包含了一段公用的数据,如果我们将整个页面全部缓存,那么假如这段数据频繁更新导致频繁过期,无疑会使得所有网页都要频繁地重建缓存,这对网页的其他部分内容似乎很不公平(意思是动态缓存时是更新整个页面,但是有时候只是数据频繁更新,这样导致所有网页都要频繁重建缓存,这样对网页其他部分似乎很不公平,那么网页缓存和数据缓存如何进行协调呢?)。此时如何协调网页缓存和数据缓存呢?是否能够将它们一起使用并各显其能呢?

另外,将数据缓存存储在哪里呢?这需要考虑多方面的因素。速度是一方面,如果无法提供高速的读写访问,那么这部分数据缓存可能不久便成为新的系统瓶颈。另外,数据缓存的共享也至关重要,如同一主机上不同进程间的共享、网络上不同主机间的共享等,一旦设计不当,将对站点未来的规模扩展带来致命的威胁。

以下为memcache数据库缓存为例,以图说明一下什么是数据库缓存:
在这里插入图片描述

数据库缓存的技术特点:性能优越、应用场景、数据一致性、高可用

数据库缓存常见开源技术:要说用于数据库缓存场景的开源技术,那必然是memcache和redis这两个中间件。

静态缓存:

说起静态缓存技术,CDN是经典代表之作。静态缓存技术面非常广,涉及的开源技术包含apache、Lighttpd、nginx、varnish、squid等。

静态缓存,一般指 web 类应用中,将图片、js、css、视频、html等静态文件/资源通过磁盘/内存等缓存方式,提高资源响应方式,减少服务器压力/资源开销的一门缓存技术。

主要包括:浏览器缓存、磁盘缓存、内存缓存、nginx的内存缓存、CDN。

动态缓存:

何为动态缓存?即对动态页面的缓存。如,对 .do、.jsp、.asp/.aspx、.php、.js(nodejs)等动态页面缓存。可以看出,动态页面一般都会涉及动态计算、数据库缓存、数据库操作,所以每一次访问同一个页面,所获得的数据可能都有所不同。所以如若对数据及时性要求较高的应用,可能不太适合动态缓存。比如,对一个动态页面缓存了半个小时,用户请求访问该动态页面,返回缓存中的数据。很有可能,缓存中的页面数据即半个小时前缓存的页面数据状态。所以,动态缓存,是牺牲数据的及时性换取性能的技术。具体缓存设置多长时间,这个根据业务情况而来。

参考文章:
https://blog.csdn.net/Jesse_cool/article/details/76174778
https://www.jianshu.com/p/43da95f30168

7.动态内容静态化

在动态内容缓存技术的实现机制中,虽然避免了可观的重复计算,但是每次还都需要调用动态脚本解释器来判断缓存是否过期以及读取缓存,这似乎有些多余,而且关键是消耗了不少时间。直接让浏览器访问这些动态内容的缓存不是更好吗?在这种情况下缓存成为直接暴露给前端的HTML网页,而整个缓存控制机制也发生了根本的变化,我们普遍称它为静态化,静态网页独立了,当家做主了,再也不用被脚本解释器呼来唤去。

8.使用负载均衡

到此为止,我们已经最大程度地发挥了单台Web服务器的处理能力,但是,当它所承受的压力达到极限时,就需要有更多的服务器来分担工作,我们需要想办法将流量合理转移到更多的服务器上。

到此为止,我们已经最大程度地发挥了单台Web服务器的处理能力,但是,当它所承受的压力达到极限时,就需要有更多的服务器来分担工作,我们需要想办法将流量合理转移到更多的服务器上。

9.优化数据库

Web服务器与数据库服务器其通信连接的建立和释放涉及代表一段内核高速缓冲区的文件描述符的创建和销毁,这需要不少的时间开销,包括系统调用导致的内核态切换以及某些异步阻塞I/O模型采用的文件描述符队列扫描机制。所以,频繁的数据库连接和释放无疑将导致数据访问等待时间的加长,这段时间浪费得毫无意义。

使用数据库持久连接有效地解决了这一难题,它包括不同程度上的持久化,本质的区别在于持久连接的应用范围和生命周期,比如某个进程内部的全局数据库连接,供进程内所有计算任务共享,在这个进程终止后便被释放;或者在某个动态内容的执行周期内,代码层面的持久连接对象,在动态内容计算结束后便不复存在;还有跨进程的数据库连接池,保存多个持久连接供应用程序重复使用。在这些采用数据库持久连接的应用设计中,同时还要注意保证数据访问的线程安全性。

与此同时,在设计关系数据库的表结构时,你是否合理使用了各种类型的索引呢?要做到这一点,你必须了解索引的有关知识,然而更重要的是如何根据Web站点变幻莫测的数据访问特点来有针对性地设计每个表的索引,这往往也是最有难度的,索引的合理使用对于依赖数据库访问的Web应用至关重要。另外,你了解数据库引擎的特征吗?

随着时间的推移,你的Web站点可能逐渐被数据库绑架,单台数据库服务器再也无法应付整个站点的需要,这包括存储空间以及查询时间,人们开始抱怨数据库模型的不良设计制约了横向扩展以及负载均衡,这不是我们希望看到的结果。为此,我们将数据散列在多台主机,包括必要的冗余数据,以此来合理地分散数据库的密集访问,数据库扩展便成为我们考虑的方案。

10.考虑可扩展性

代码层面的扩展,还有架构层面的扩展,设计的内容非常多。

11.减少视觉等待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值