关于网站访问速度调优指南

来源:互联网 发布:js单例模式 命名空间 编辑:程序博客网 时间:2024/05/21 22:53

  一般来说,一个网站的访问速度最直观的体现是在网页的访问速度上,在没有高流量的情况下,网页平均访问速度超过2秒以上,基本上就属于异常情况了。当然,做大促导致出现高流量的情况,在某个时间段网站访问速度变慢,这种就更加复杂,其中可能涉及到消息队列吞吐量,数据库性能,分布式协调工具效率,soa服务调用速度,tomcat服务器数量,日志框架选型,缓存可用性等等,本文暂时不对这种高流量的情况进行分析,只阐述一般情况下网站的性能调优方案。

          提升访问效率前端之关于分析工具:当一个页面访问速度慢时,我们可以通过浏览器自带的debug功能对网页进行分析。网页包含什么内容:html标签,css,js,数据,图片等等。所有的这些元素都是由后台server返回。通过工具,我们可以查看网页各个元素的访问时间,其中最耗时间的莫属图片。也可以查看某个接口的响应时间,我们可以非常形象的看到浏览器和后台的交互情况,所以,先熟悉debug工具的使用。

          提升访问效率前端之关于图片:一般我们都会对图片选择cdn加速。后台运维上传图片时,最好对图片进行压缩,避免出现几M的图片直接展示在网页上。我相信大家遇到过类似情况,运维上传一张很大的图片,直接展示在了网页上。结果搞活动时出现网页打不开或者访问很慢的情况。我们也可以在代码层面做约束,后台直接约束大于多少M的不让上传,或者做图片压缩。 

          提升访问效率前端之关于js,css:js,css文件的压缩,合并,是提高网页响应速度一种途径,其可以减少网络传输体,减少网络请求数,从而提高网页访问速度。

         提升访问效率前端之对于页面模板:一般来说,一个网站访问最频繁的当属首页。经过alexa统计,淘宝首页的周日平均访问量在1亿到2亿左右。这么大的访问量,如果没有页面模板静态化,全部都是事实的动态数据,我相信淘宝要花钱买更多的服务器,性能也会低很多,这个当然不可取。网页的排版成型,其实可以定义一个静态模板,定时填充动态数据即可。而用户访问的是静态数据,利用nginx这种处理静态网页逆天的工具,可以大大提高首页的访问性能,模板化工具可以选择freemarker,velocity等等。

       提升访问效率前端之对于ajax:利用ajax的局部刷新机制,避免不必要的访问请求,也是一种优化方式。

        前端优化访问速度终究不能治本,请求最终还是由后台返回,会经过后台逻辑处理,如何提高后台server的能力,才是实道。

        提升访问效率后端之关于集群:我相信大家都了解,一个店本来只能容纳1000个人,结果当天来了10000人,不把这个店挤爆才怪。其结果肯定是服务员苦不堪言,顾客怨声载道。我相信作为老板的你首先想到的是扩大店规模 ,这个逻辑和后台服务器处理能力类似,一台tomcat处理请求大概维持在1200-1800左右,如果来了10000个请求,tomcat百分百响应延迟。原因之一是没有空闲线程处理请求,原因之二可能是cpu密集或者io密集。这时对后台进行集群将会是一个很好的解决方案。负载均衡方式很多,硬负载,软负载。考虑到成本和效率,我们可以选择开源的nginx进行软负载,其效率非常之好,许多大型的网站都使用其做负载均衡工具。当然集群涉及到session共享问题,这也有很好的成熟方案,例如缓存,cookie等等。

        提升访问效率后端之关于缓存:网页上的动态数据都来源于后台返回,后台数据存储大部分在数据库,或者文件系统中。如果用户的每一个请求都要对db进行操作,再强大的db,都扛不住如此大的压力。所以,缓存必不可少。缓存开源的有memcache,redis,或者其他开源的中间价,我个人倾向于使用redis,因为其有集群方便,api丰富,数据可持久化,基于内存,单核,线程安全等等多种优越性。redis同时支持高效快速的客户端访问,在提高客户端访问效率的同时,可以大量降低db的访问压力。访问频繁且更新操作比较少的数据,完全可以通过缓存进行存储,使用后你会发现系统的响应效率在客户端访问频繁时有很大的提升。不过要考虑好缓存和数据库数据一致性问题,其中的主要情况包括如下:缓存击穿,缓存失效,缓存过期,缓存数据同步等等。

       提升访问效率后端之关于db读写分离:展示给前端的数据来源,主要来自于db 。如果db挂掉,响应缓慢,对系统来说是灾难性的,所以维护db的稳定性,高可用性,对其所属的系统及其重要。一般我们会通过读写分离和分库分表对db进行优化,主流的mysql读写分离分库分表中间件例如cobar,tddl等都可以采用。这种方式可以缓解db压力,提高db性能,也能适应将来业务的发展,不会因为db的问题阻碍业务扩展。比较经典分库分表案例:用户订单列表和商户订单列表,用户要查询自己的订单。商户也要查询自己的订单,根据单一的用户规则进行分库发表或者单一商户进行分库分表都无法满足另外一个群体的需求,这时候只能考虑通过同时存储两份数据,使用不同的分库分表方案来实现。

       提升访问效率后端之关于多线程:单核的处理器性能即使再好,也无法同时处理多个客户端请求。而现在服务器核个数动不动就是10几个,也就是说,服务器可以同时处理10几个请求,这些请求之间不存在线程上下文切换,没有性能消耗。充分利用服务器资源,采用线程池的方式,对于一些访问耗时较长,步骤较多,可以分多步执行然后在汇总返回给客户端。目前成熟的实现方式例如:CyclicBarrier,CountDownLanch,Future等都可以采用。

     提升访问效率后端之关于jvm调优:jvm调优是一门很深很深的学问,各种参数配置,新生代,年老代,持久代,堆,栈的大小,以及出现问题后通过jconsole,jstack,jmap,jinfo对虚拟机进行分析。这里无法一一列举所有的情况,只能靠自己的经验去慢慢积累。例如堆,栈的初始化大小,最大值大小,新生代大小等等。

      本文旨在提供一些优化网站访问速度的思路,其实现方式当然不仅仅于此。随着网站的访问量增大,业务场景日益复杂,我们遇到的问题会越来越多。但是,只要我们找到问题本质,一步步分析,基本上所有我们遇到的问题肯定有人已经遇到过。要相信,皇天不负有心人,在技术路上,只要肯花时间,即使再笨的人,都可以独当一面……

                    ---------------------------------------------至对技术钟爱的你

0 0