访问一个网站,怎样才算快呢?
明白这个问题的意义至少有三个:
比如这个非是非站点,自己常怀疑自己的网站速度不够快,也花了不少时间学习思考和实践“更快”的办法。但也难免有时会产生疑虑“这些努力值得吗?”(此处不讨论知识的收获)
“判断是否够快”很像是一个对自身的定位问题,和“自己的收入算高吗?”性质很像。解决的办法不是自己猜,也不是别人告诉你。最好的办法是你能看一看别人的工资账户。
看别人的工资帐户可能不是很容易的事情,看看别人家网站的速度情况还是一定程度上可以的。
拆分一下访问一个网站页面所涉及的各个环节:
为了提高用户的访问速度,人们在各个环节也都做了多种努力。
比较模糊的一个数据是:DNS查询可能耗费100ms左右,网络连接从50ms到300ms不等,网页生成从20ms到500ms甚至更多不等。
不考虑更多细节,仅从上面几个数据看,用户访问一个页面就可能需要至少 100+300+500+300=1200ms
从这个角度讲,在服务器端用几百毫秒生成一个页面是不算慢的(通常可以优化到100ms之内)。它不是整个问题的瓶颈。
这也同时可以解释为什么服务器端使用脚本语言不是什么太大问题。各种不同脚本语言之间的性能差异对于小型应用也不是什么大问题。
DNS查询很显然和托管域名的服务器有关。这主要提现在Name Server的选择。
比如域名主要是面向国内用户,那很可能托管给dnspod.cn要比托管给国外的服务器要快。
另外域名查询的结果的缓存时间TTL可以设置的大一些的话,应该也是有帮助的。
如果确信域名对应的IP地址不会经常变动,把域名查询的TTL设置为86400秒(24小时)显然比设置为600秒(10分钟,dnspod的默认值)可能更为有利。
网络速度主要和服务器的在网络中的位置相关。今天的服务器的性能一般都不是个问题。
网络上的节点位置距离某些节点近的同时,距离另外一些节点可能就比较远。因此提高网站访问速度在网络速度这个环节,CDN是一个重要角色。
Web服务器为了生成页面很可能需要跟别的服务器进行交互,最常见的是数据库服务器(比如Mysql)。这种交互通常都是速度的瓶颈。
很容易想到,也是很重要的应对技术之一是缓存,各种各样的缓存。比如,缓存数据库查询结果,缓存中间计算结果,缓存所生成的页面等。
再比如流行的PHP脚本中,向MySql数据库查询时会发生IO阻塞,等待查询数据的返回。一方面查询本身就是一个相对耗时的任务,另一方面这种IO阻塞也影响了当前进程的效率。"Node.js"的一个卖点之一就是可以避免这种IO阻塞,虽然这其实不是什么新鲜技术(Tcl/Tk本身早就在使用Event Drivent了)。
这个环节很容易得出以下结论:
也因此就有了相应的CSS合并,Image Sprites, Lazy Load,针对静态资源的CDN等技术和服务。
比如七牛云存储的CDN,其访问速度比自己的站点快好五六倍(根据ping的结果)。
对于公共静态资源,基于七牛云存储的开放静态文件CDN也是不错的选择(为什么?)。
到了页面的渲染和执行阶段,基本上就是前端攻城师的用武之地了。这是一个入门简单,精通不易的领域。
TODO