网页浏览的速度怎样才算快

风行水上 @ 2013-12-08 14:32:02
标签:

    访问一个网站,怎样才算快呢?

    明白这个问题的意义至少有三个:

    • 避免过早的优化
    • 理解架构的关键
    • 知道问题所在才知道哪里发力

    比如这个非是非站点,自己常怀疑自己的网站速度不够快,也花了不少时间学习思考和实践“更快”的办法。但也难免有时会产生疑虑“这些努力值得吗?”(此处不讨论知识的收获)

    “判断是否够快”很像是一个对自身的定位问题,和“自己的收入算高吗?”性质很像。解决的办法不是自己猜,也不是别人告诉你。最好的办法是你能看一看别人的工资账户。

    看别人的工资帐户可能不是很容易的事情,看看别人家网站的速度情况还是一定程度上可以的。

    访问速度的构成

    拆分一下访问一个网站页面所涉及的各个环节:

    1. DNS查询域名得到IP地址
    2. 向Web服务器发起请求(通常是HTTP协议的TCP连接)
      • 基本上就是所谓网速的问题
    3. Web服务器生成页面
      • 基本上就是网站开发者所考虑的性能问题
    4. 接收服务器返回给浏览器的数据 (速度可以等同于前面的请求阶段)
    5. 浏览器解析HTML代码,加载CSS,Javascript,Image等各种资源文件
      • 通常或多或少会涉及到向其他的服务器请求数据
    6. 渲染页面和执行相关代码

    为了提高用户的访问速度,人们在各个环节也都做了多种努力。

    比较模糊的一个数据是:DNS查询可能耗费100ms左右,网络连接从50ms到300ms不等,网页生成从20ms到500ms甚至更多不等。

    不考虑更多细节,仅从上面几个数据看,用户访问一个页面就可能需要至少 100+300+500+300=1200ms

    从这个角度讲,在服务器端用几百毫秒生成一个页面是不算慢的(通常可以优化到100ms之内)。它不是整个问题的瓶颈。
    这也同时可以解释为什么服务器端使用脚本语言不是什么太大问题。各种不同脚本语言之间的性能差异对于小型应用也不是什么大问题。

    DNS查询

    DNS查询很显然和托管域名的服务器有关。这主要提现在Name Server的选择。

    比如域名主要是面向国内用户,那很可能托管给dnspod.cn要比托管给国外的服务器要快。

    另外域名查询的结果的缓存时间TTL可以设置的大一些的话,应该也是有帮助的。
    如果确信域名对应的IP地址不会经常变动,把域名查询的TTL设置为86400秒(24小时)显然比设置为600秒(10分钟,dnspod的默认值)可能更为有利。

    网络速度

    网络速度主要和服务器的在网络中的位置相关。今天的服务器的性能一般都不是个问题。

    网络上的节点位置距离某些节点近的同时,距离另外一些节点可能就比较远。因此提高网站访问速度在网络速度这个环节,CDN是一个重要角色。

    Web服务器生成页面

    Web服务器为了生成页面很可能需要跟别的服务器进行交互,最常见的是数据库服务器(比如Mysql)。这种交互通常都是速度的瓶颈。

    很容易想到,也是很重要的应对技术之一是缓存,各种各样的缓存。比如,缓存数据库查询结果,缓存中间计算结果,缓存所生成的页面等。

    再比如流行的PHP脚本中,向MySql数据库查询时会发生IO阻塞,等待查询数据的返回。一方面查询本身就是一个相对耗时的任务,另一方面这种IO阻塞也影响了当前进程的效率。"Node.js"的一个卖点之一就是可以避免这种IO阻塞,虽然这其实不是什么新鲜技术(Tcl/Tk本身早就在使用Event Drivent了)。

    加载各种资源文件

    这个环节很容易得出以下结论:

    • 尽量减少外部资源文件的数量
    • 尽量减少外部资源所依赖的域名数量
    • 外部资源文件的高效缓存很重要

    也因此就有了相应的CSS合并,Image Sprites, Lazy Load,针对静态资源的CDN等技术和服务。

    比如七牛云存储的CDN,其访问速度比自己的站点快好五六倍(根据ping的结果)。

    对于公共静态资源,基于七牛云存储的开放静态文件CDN也是不错的选择(为什么?)。

    渲染页面和执行相关代码

    到了页面的渲染和执行阶段,基本上就是前端攻城师的用武之地了。这是一个入门简单,精通不易的领域。

    TODO

    标签:

      分享到:
      comments powered by Disqus

      30/34ms