阅读笔记《大型网站技术架构核心原理与案例分析》《高性能网站建设指南》

 软工三班 曹亚凯

在周四的专业课上阅读了两位业界前辈的专业参考书,因为小组要做的针对性研究探讨方面是关于网站性能的,所以针对于网站性能优化,根据其前辈书中的知识做一些总结和感悟:

一、性能的定义

        性能作为我们要着重于探讨的重要对象,其实是比较抽象而且比较难以总结的概念,因为我们可以从太多的维度去分析,比如说性能的指标上,可以具体体现到响应时间、吞吐量等技术指标,同时也是主观的感受,而感受则是一种与具体参与者相关的微妙的东西,用户的感受和工程师的感受不同,不同的用户感受也不同。

        从用户角度,网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢。用户感受到的时间,包括用户计算机和网站服务器通信的时间、网站服务器处理的时间、用户计算机浏览器构造请求解析响应数据的时间。

       从开发人员视角看的网站性能,开发人员关注的主要是应用程序本身及其相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定性等技术指标。主要的优化手段有使用缓存加速数据读取,使用集群提高吞吐能力,使用异步消息加快请求响应及实现削峰,实现代码优化手段改善程序性能。

二、性能的具体参考指标

1、响应时间

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

2、并发数

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

3、吞吐量

      单位时间内系统处理的请求数量,体现系统的整体处理能力。

4、性能计数器

     描述服务器或操作系统性能的一些数据指标,包括数据与线程数、CPU使用、磁盘与网络IO等指标。

三、优化性能的方法

优化网站性能的角度可以去从不同的端口和不同的层面入手

浏览器端:浏览器缓存、页面压缩、合理布局页面、减少Cookie传输、使用CDN减轻应用服务器负载压力

应用服务器端:使用服务器本地缓存和分布式缓存、通过异步操作将用户请求发送给消息队列后等待任务处理

代码层面:通过使用多线程、改善内存管理

数据库服务器端:索引·、缓存、SQL优化、NoSQL数据库通过优化数据模型、存储结构、伸缩特性

具体方法介绍如下:

  1. 减少DNS查找:通过使用Keep-Alive和较少的域名来减少DNS查找 
  2. 精简JavaScript外接脚本:压缩文件大小或者直接对源码进行精简
  3. 避免重定向:寻找一种避免重定向的方法
  4. 移除重复脚本:确保脚本只被包含一次
  5. 配置ETag:主要是对expires头的增加,这样相当于临时设置了一个当前文件的副本,避免主界面处理许多不必要的HTTP请求,不过有的时候对于处理请求不多的情况expires头的存是赘余的,应该删除掉
  6. 减少CSS:将所有的JavaScript和CSS文件都放到外部文件中
  7. 使Ajax可缓存,确保Ajax请求遵守性能指导,尤其应该具有长久的expires头

以上大概就是前辈书记当中所涉及到的不同种类的和应对不同情况的网站性能优化的方式,由于是初次阅读了解这方面的知识,所以很多内容不能做到彻底了解和更多的拓展分析,在后续的学习当中应该注意主动的去补全这方面的知识和具体的操作。

下面是对于以上操作的一些搜集来的概念,助于自己的理解和后续的深入学习:

1、减少DNS查找

    由于DNS查找是需要时间的,而且它们通常都是只缓存一定的时间,所以应该尽可能地减少DNS查找的次数。

    减少DNS查找次数,最理想的方法就是将所有的内容资源都放在同一个域(Domain)下面,这样访问整个网站就只需要进行一次        DNS查找,这样可以提高性能。

    但理想总归是理想,上面的理想做法会带来另外一个问题,就是由于这些资源都在同一个域,而HTTP/1.1中推荐客户端针对每个域只有一定数量的并行度(它的建议是2),那么就会出现下载资源时的排      队现象,这样就会降低性能。
    所以,折衷的做法是:建议在一个网站里面使用至少2个域,但不多于4个域来提供资源。

2.精简JavaScript脚本

    使用JavaScript对象解构来节省代码,常见的和常用的情况有如下几种:

         1.通过条件判断给变量赋值布尔值

         2.在if中判断数组长度不为零

         3.三元表达式

         4.shiyongincludes简化if判断

         5.使用some办法判断是否有满足条件的元素

         6.使用foreach方法遍历数组,不形成新数组

         7.使用title方法过滤原数组,形成新数组

3.避免重定向

      首先我们要明白发生重定向的原因:一是服务器本身的一些行为,二是程序中做了明确的重定向。

      其实重定向的发生其实是不太可能避免完全的,我们可以选择一些方法来解决相关问题

      首先就是在定义链接地址的href属性的时候,尽量使用最完整的直接的地址

      其次就是在使用Response.Redirect的时候,设置第二个参数为false

      还有就是如果涉及到从测试环境道生产环境的迁移,建议通过DNS中的CNAME的机制来定义别名,而非强制地重定向来实现

4、移除重复脚本

     对于一些历史遗留站点或者是论坛类的网站来说,这倒是比较常见的

5、配置ETag

     对于Etag,可能是多数网站维护者都会忽略的地方。在这一系列优化规则出现之前,可能互联网上绝大多数站点都对这个问题忽略了。当然,Etag 对多数站点性能的影响并不是很大。除非是面向RSS的网站。意思是"很多网站在不注意的情况下都是打开Etag 的,而没有网站关心如何用,消耗资源而不知。并不是说Etaa不好,合理利用Etaa ,绝对能取得很好的收益。

6、减少CSS

     最重要的一点就是减少CSS表达式的出现,除此之外还可以将CSS放到代码页上端,浏览器可以有针对性地对html页面从上到下进行解析和渲染,从而避免了用户在发出请求以后等待时间过长的局面。还可以将JavaScript和css代码剥离,剥离后能有效地对其进行单独处理。当然,在不可避免不得不将两类代码加进来的时候,尽量使用<link>而非import

7、使得Ajax可缓存

     响应时间对于Ajax来说至关重要,否则用户的体验感会急剧下降。提高响应时间的最好办法就是Cache。

    针对页面中主动的Ajax请求返回的数据要缓存到本地,当然这个是针对短期内不会变化的数据。如果不确定数据变化周期的 话,  可以增加一个修改标识的判断,我正常处理过程中会给一些Ajax请求返回的数据增加一个ND5值的判断,每次请求会判断当前MDs是否变化,如果变化了取最新的数据,如果不变化,则不变。

 

以上就是今天对于两本参考书的通读感想。

     

     

 

 

 

 

 

 

     

 



 

posted @ 2023-03-02 19:22  热爱代码的某人  阅读(28)  评论(0编辑  收藏  举报