网站的灵魂:性能
什么是性能
有人说性能就是访问速度快慢,这是最直观的说法,也是用户的真实体验。 一个用户从输入网址按下回车键到看到网页显示在眼前所经过的时间快慢 ,这就是 性能 。对于我们来说,需要去挖掘这个过程,因为这决定我们怎么去做性能优化。
用户访问网站的整个 过程中,中间究竟发生了什么?
用户访问网站 的 整个流程 :用户输入网站域名,通过 DNS解析 ,找到目标服务器IP,请求数据经互联网达到目标服务器,目标 服务器 收到请求数据,进行 处理 (执行程序、访问数据库、文件服务器等)。处理完成,将响应数据又经互联网返回给用户浏览器, 浏览器 得到结果进行计算 渲染 显示给用户。如上图所示, 我们把整个过程,分为三段路径:
1 : 第一段在用户和浏览器端,主要负责发出用户请求,以及接受响应数据进行计算渲染显示给用户;
2 : 第二段在网络上,负责对请求数据、响应数据的传输;
3 : 第三段在网站服务器端,负责对请求数据进行处理(执行程序、访问数据库、文件等),并将结果返回。
下面我们对这三个路径分别进行分析。
第一路径
第一路径 花费的时间 包括 输入域名 发起请求的时间 和 浏览器收到响应后计算渲染的时间 。
输入域名发起请求的过程是:
1 : 用户在浏览器输入要访问的网站域名;
2 : 本地DNS请求网站授权的DNS服务器对域名进行解析,并得到解析结果即IP地址(并将IP地址缓存起来) ;
3 : 向目标IP地址发出请求 。
从这个过程我们可以看到, 优化 的地方主要是 减少DNS解析次数 , 而如果用户浏览器设置了缓存,则再第二次访问相同域名的时候就不会去请求DNS服务器,直接用缓存中的IP地址发出请求。因此这个过程主要取决于浏览器的设置。现在主流的浏览器默认设置了DNS的预取功能(DNS Prefetch),当然你也可以主动告知浏览器我的网站需要做DNS预取:
<meta http-equiv="x-dns-prefetch-control" content="on" />
浏览器将数据进行计算渲染的过程:
1 : 浏览器解析响应数据;
2 : 浏览器创建DOM树;
3 : 浏览器下载CSS样式,并应用到DOM树,进行渲染;
4 : 浏览器下载JS文件,开始解析执行;
5 : 显示给用户。
从这个过程,我们可以找出不少可以 优化 的地方。首先我们可以尽量 控制页面大小 ,使得浏览器解析的时间更短;并且将多个CSS文件、JS文件 文件合并压缩 减少文件下载的次数和大小;另外注意 将CSS放在页面前面,JS访问页面后面 ,这样便于页面首先能渲染出来,再执行js脚本,对于用户来说有更好的体验。最后我还可以 设置浏览器缓存 ,下次访问时从缓存读取内容,减少http请求。
<meta http-equiv="Cache-Control" content="max-age=5" />
该代码说明了浏览器启用了缓存并在5秒内不会再次访问服务器。注意缓存的设置需要结合你的业务特性来适当配置。
以下是京东商城的HTML简图: css样式放在html前面,并且进行了合并。
大多数的JS文件放在页尾。
第二路径
第二路径在网络上, 时间花费 同样包括 请求数据的传输时间 和 响应数据的传输时间 ,这个两个时间取决于数据传输的速度,这里我们要讲一个名词“ 带宽 ”。什么是带宽,我们经常说带宽10M,20M是什么意思?我的带宽20M,这意味着什么?
我们知道带宽速度分为上行、下行速度,也就是上传和下载的速度。带宽20M对于用户来说则是下载速度20M(20×1024×1024比特率),换算成字节20M/8=2.5M。也就是说20M的带宽下载速度理论可达2.5M/s,而对于家庭用户而言上传速度一般比下载速度小的多,大约是不到十分之一。而对于网站服务器(企业用户)来说,则不然,一般上行速度等于下载速度。这也是运营商根据实际需求分配的,毕竟用户的主要需求是下载数据,而不是上传数据。
整个流程从传输方式看就是 :用户发送请求数据(上传),网站服务器接受请求数据(下载),网站服务器返回响应数据(上传),用户接受响应数据(下载)。对于用户来说,上传数据是很小的(Url参数),而下载数据是较大的(响应数据);对于服务器来说,下载数据是很小的(url参数),上传数据是较大(响应数据)。理解了这个,我们可以解释 为什么有时用户反映为什么自己的带宽足够,但打开某些网站仍然很慢 ,就是因为尽管用户的下载速度很快,但网站服务器的上传速度很慢,这就像一个抽水管和一个出水管,不管抽水管再大,但出水管很小,同样抽到的水量是有限的。
了解了这个原理我们来看 怎么提高数据传输的速度 ,首先用户的上传、下载速度我们是无法决定的,我们能决定的是网站服务器的上传、下载速度,所以我们可以做的是适当的增加服务器带宽(带宽是很贵的,盲目的增加只会增加不必要成本)。购买合适的带宽需要根据网站业务特性、规模以及结合运维人员的经验来选择。通常可以考虑的算法,即根据一次响应数据的大小,乘以PV数,除以对应的高峰时间段,从而大致估算出网站带宽的需求。