如何在短时间内快速提升网站响应速度

前言:

        目的:我从事软件性能优化工作多年,想在此总结一下网站性能优化的一些实战经验。

        背景:当你负责公司网站运维时往往会遇到以下场景:领导要你维护一个开发人员赶工期开发出来的一个新网站。而新网站往往bug多,更没有经过什么性能优化。网站上线以后用户量一大,就会面临请求慢、页面卡顿等问题。有时候甚至会引发服务器cpu、带宽、内存、硬盘等硬件设备满载。这时候就需要你对这个网站进行性能优化。往往需要你:用最小的工作量、最短的时间、最少的代价,最大程度地提升网站响应速度。

        本文所面向的受众:本文描述的性能优化手段适用于中、小型网站。因为我目前维护的网站规模属于日活越用户量(DUA)在几千级别的中型网站规模。

        性能优化遵循的两个原则:木桶效应与二八定律

        这是我总结的两个原则,理解这两个原则,可以帮助您在性能优化过程中省时省力、抓住重点、有的放矢。毕竟每个人的时间精力有限,不要把它花在效益不高的地方~

        木桶效应:

        我们知道,一只木桶的盛水量,取决于桶壁上最短的那块。同样,一个软件或网站的运行流畅程度,取决于运行速度最慢的环节。

        举例:一个网络请求从发起到结束,一般要经历用户操作页面、浏览器发起请求、域名解析、HTTP\HTTPS请求、WEB服务器响应请求(涉及cpu、内存、数据库等的运行)、返回响应数据、客户端浏览器下载响应数据并渲染数据。期间每个环节都可能成为短板,比如:短板可能是服务器硬件条件差、数据库设计不合理、代码组织不合理、视频图片文件太大加载慢等等因素。

        木桶效应告诉我们,性能优化的“理想过程”往往是:先找出最短的短板,然后给他加长,然后再找下一块最短的短板,再加长,循环往复。

        二八定律:

        生活中,世界上80%的财富掌握在20%的人手里。软件中,一个软件的性能由20%甚至10%的环节所决定。.

        引用一段《.net 性能优化》中Vance Morrison的话:一般来说,你的应用程序中有超过90%的代码对性能是不敏感的,它可以使用程序员生产力最大化的方式来编写(尽可能使用最少、最简化、最容易的方式来编写代码)。然而,剩下的10%,则值得投入大量关注。编写这部分代码需要做出精细计划,甚至需要在代码编写之前进行。为了做出正确的计划,必须收集数据(各类操作及类库调用究竟有多快),为此需要测试工具(Profiler)。这些是所有高性能软件项目的基石,务必留心。加入真正掌握了这些内容,写出高性能的软件也不会是困难的事情。

        举例1:一个网站一定有常用功能和不常用功能,这些常用功能往往只占整个网站功能的20%甚至更少。

        举例2:一个软件或网站,读写请求频率比一般为 80%:20%。也就是说一个网站,8成的资源开销都花在数据查询读取上,2成开销花费在增删改上。

        二八定律告诉我们性能优化时的重点应该放在决定了80%资源开销的这20%的功能代码里。

实操篇:

        接下来,我在此,根据木桶效应与二八定律,分享一下我再运维时是如何快速优化一个网站的性能的。以下是我梳理的性价比从高到低的性能优化方案。

        第一步:压缩文本

        什么是文本压缩?一个网站,文本资源占用了很大一部分,前端html、css、js文件都是文本,前后端也都是通过json文本进行请求和响应。文本压缩,可以最大程度地减少通过网络传输的字节数,所以使用文本压缩是一个可以短时间内快速提升网络响应速度的方式。文本压缩分为:

        1、请求与响应数据的压缩,即:json压缩。 【 这是我使用的响应压缩方法(.NET版)

        2、前端静态文件压缩,即:css、js压缩

        为什么压缩文本是第一步?

        1、代码性能优化工作量小。统一修改少量代码就可以实现对网站中所有文本的压缩。

        2、作用面广。一个网站,可能成千上万的地方用到了文本。只要你花费一次性精力做了文本压缩,成千上万的地方统一都会被你一次性优化掉。

        3、效果显著。zip压缩率高,文本压缩一般在80%以上。(类似于txt文件压缩成zip包的效果)

        4、显著减少服务器带宽、网络压力,但也会消耗少量cpu进行压缩。

        第二步:压缩图片及视频

        1、对图片和视频本身做压缩

                1、对前端静态图片及视频进行压缩。直接压缩工具压缩即可。注意:压缩分为质量压缩和尺寸压缩。

                        a、图片:

                                       1、质量压缩:【 这是我使用的批量图片压缩方式

                                        2、尺寸压缩:根据业务,对不同页面的图片进行尺寸压缩

                        b、视频:

                                        1、质量压缩:

                                        2、尺寸压缩:对一个项目中所有视频进行压缩

                2、对后端动态上传的图片及视频进行压缩。

                        a、修改上传接口代码,在接口内部对用户上传的图片及视频进行压缩

                        b、对用户已经上传的图片及视频进行压缩。直接拿图片or视频压缩工具压缩即可。

        2、图片or视频列表页面,使用缩略图(thumbnail)代替原图或者视频。

        第三步:将所有后端接口的响应时间记录到日志中

        第四步:数据分页

        数据分页是很常见的性能优化

        第五步:前端懒加载

        

        第六步:使用 Javascript 库 CDN

        第七步: 数据库使用索引

        第八步:使用缓存

        第九步:数据库数据访问优化:用【select (字段1,字段2,字段3) 】代替【select *】

        第十步:开启定时器定期对数据库假删除or老旧弃用数据or业务逻辑处理过程中的中间过程数据

        第十一步:使用负载均衡

        第十二步:使用多线程

        1、后端在逻辑上可以进行异步响应的接口,可以使用异步:一个接口的主线程,在某个节点直接开启子线程让子线程去处理耗时操作,而主线程不必等候子线程的执行结果,就直接返回响应给前端。

        2、特别耗时操作可以使用多线程并发完成任务,最后把子线程的处理结果合并到一起,如循环体内、图像处理等等。

本文持续更新中…

    原文作者:切糕师学AI
    原文地址: https://blog.csdn.net/guigenyi/article/details/122660790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞