stackOverFlow性能提升之Cookie

本文翻译自a-few-speed-improvements,并不是原创。转载请标示:http://hushengdong.com/2016/11/15/stackOverFlow性能提升之Cookie#more
作者Jeff Atwood 2009年8月9日,似乎是一篇很老的文章了。
在WEB开发的时候,性能提升的方法有很多,来看看stackoverflow的工程师的一些做法。

在上周的时候,我们对Stack Overflow的引擎做了几个性能上的提升。

首先,我们使用ANTS Profiler做了一次快速检查并且在代码中找到了几个冗余或者没有必要的数据库查询,我们几乎每几个月都会对几个页面做这样的检查,开始跟踪页面的性能之后,我们刷新指定的页面50次,然后检查热点代码,发现几乎都是数据库查询阻塞并拖慢了性能,我们很少把热点代码写的如此之糟糕,但是确实出现在了我们的热点代码中,不管怎么说,黄金法则就是评估,然后优化,这就是我们尝试去做的。

我们也花了很长时间,很多精力在优化服务端发送给浏览器的Cookie上面,(当然,浏览器很尽职尽责的把cookie加在每一个HTTP请求中返回给服务端了),你可能会特别惊讶Cookie对性能的影响有多么大,我们去掉了ASP.NET表单鉴权Cookie,并且把我们Cookie中的Key的长度减小到原来的一半,我也把登陆页面的很多确实不需要的Cookie给删除了。在我的测试中,现在的Cookie大约是360字节,以前大约是500多字节,随着时间的推移,这些旧的不需要的Cookie会自然慢慢减少,不过你(这里暗指作者自己)可能想通过手动的清理Cookie来提供最快最好的Stack Overflow的浏览体验。

有一个不是最新的但是绝对值得注意的是,几个星期之前,我们把HTTP GZIP压缩的级别从默认的0提高到4,压缩速度有那么一点点慢了,但是整个页面的大小减少了10%,在CPU性能和文件大小之间权衡的设置请查看Scott Forsyth的详尽记录,最合适的设置是4。

我们很早就是YSlow的用户了,最近也在用Google Page Speed,一些工具的选择也只有当你是Google或者雅虎量级的时候才会比较敏感,(‘gee的很少的选择,多样化的一个很好的问题。注:这里不知道怎么翻译,原文:a very rare and select club of the ‘gee,tht’s a nice problem to have’ variety),很多时候不管你的网站流量有多大,这些工具都十分重要。

我们最近使用的YSlow Page Speed和Page Speed建议中最值得跟踪的就是去Cookie的中间件

当浏览器带着Cookie去请求一个静态图片的时候,服务器根据不使用这些Cookie,除了造成网络拥堵之外没有更好的作用了,你应该让你的组件在请求静态资源的时候是没有Cookie的,创建一个2级域名来提供这些服务。

如果你的主站是www.example.org,你可以把静态资源放到static.example.org,但是,如果已经在1级域名里example.org中设置了Cookie,那么所有发往static.example.org的请求都会携带这些Cookie,在这种情况下,可以买一个全新的域名,把静态资源放在这里,然后保持没有Cookie,雅虎使用了yimg.com,YouTube使用的是ytimg.com,亚马逊使用的是images-amazon.com等等。

另外一个使用单独主机来存放静态资源的好处是有些代理拒绝缓存携带Cookie的请求。这个前提下,如果你需要使用example.org或者www.example.com作为主页,考虑下Cookie碰撞,删除www使用example就没选择了,这么做就会把Cookie写到*.example.org,(意思是所有的1级域名的2级或者3级域名都会携带这些Cookie),所以最好把Cookie写到2级域名下。(意思是不能写到1级域名下)

为此我们一个月前注册了sstatic.net,我们荣幸的告诉大家所有的stackOverFlow的系列网站的静态资源都已经放到sstatic.net下了。,这个主机肯定是不携带Cookie的并且专门为提供静态资源做了优化,减小了请求头。(并且像以前一样,几乎不过期,所以几乎没有请求能穿透缓存服务器)。

下面是一个新配置下的get请求/响应的的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /so/js/master.js?v=4143 HTTP/1.1
Host: sstatic.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2)
Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://stackoverflow.com/questions/1252349
Pragma: no-cache
Cache-Control: no-cache

sstatic.net的响应是:

200 OK
1
2
3
4
5
6
7
8
9
10
11
Cache-Control: max-age=604800
Content-Type: application/x-javascript
Content-Encoding: gzip
Last-Modified: Sun, 09 Aug 2009 18:45:13 GMT
Accept-Ranges: bytes
ETag: "75e6f1872119ca1:0"
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Date: Sun, 09 Aug 2009 23:40:45 GMT
Content-Length: 10417
(... gzipped data ...)

看到了没,没有Cookie!( 是的,我也想在响应中删除服务器头部ETag头部,但是不容易做到。)

使用其他的服务器来提供静态内容服务也是原始的负载均衡的实现方式,我们已经把成百上千的请求从我们私有的服务器上明确的分发给其他的已经专门做过优化的服务器上,浏览器在看到资源来自不同的主机之后也乐于并行处理下载,或者至少是来自不同的子域名。

不管怎么说,我们相信性能是未来的趋势,并且我们对于Stack Overflow下的所有网站提供尽可能快的访问速度是很重视的,我们将会在未来的几个月里继续重新检查我们的性能并且每一次都会尽力提升一点。

全文完。