保持活力或不活跃

我的公司正在推出一个新的网站,在很短的窗口内可能有大量的访问者(预计在2分钟内大约有14k人)。

所以,我正在检查我们的configuration,而我现在最大的问题是使用保持活动的单节点HTTP前端。 前端在CentOS 5.4上运行lighttpd 1.4。

一些假设:

  • 浏览器通常会打开6个并行TCP连接来保持活动状态
  • 浏览器将保持连接处于打开状态,直到达到超时,即使该选项卡已closures(在FF中观察,在每个浏览器上可能都不是这样)
  • 在服务器端,每个连接都会消耗内核的〜150K的内存(我使用conntrack并且想保留它,估计是否正确?)
  • 我们所有的服务器都托pipe在东海岸。 来自拉斯维加斯的服务器的RTT大约是80ms。
  • 具有保持活动的主页使用约25个TCP连接和1500个数据包。 没有保持活跃,这个数字上升到约210个TCP连接和超过3200个数据包。

那么,6 * 14000 = 84,000个TCP连接。 84,000 * 150KB〜= 12GB的内存。 这里是问题:1.我没有在前端可用的内存量。 2. lighttpd 1.4不太适合用这个连接来pipe理。 它伤害的命中/很多。

但是另一方面,如果我停用keepalive,我担心80ms RTT。

我将用一个辅助lighttpd减轻CDN和辅助wwwlogging中的一些问题。 但辩论涉及保持活力的特征。 我想把它关掉,但是我担心页面打开时间的影响会很高(高RTT和两倍的数据包)。

一旦完成了内容检索,我们就会有很多浏览网站的Ajax请求,这些请求通常适用于单个TCP连接。 但我不确定浏览器会释放其他连接,只保持一个打开。

我知道有很多讨论关于保持活力消耗很多资源。 我同意这一点,但考虑到假设和情况(一半的用户在80毫秒到100毫秒之间的RTT),你认为停用它是明智的吗?

作为一个侧面的问题:你知道我在哪里可以find关于内核连接大小和conntrack大小的信息? (printf size_of(sk_buff)除外)。

—编辑:一些testing结果我configurationconntrack接受500k连接(考虑到内存占用,它不应该超过200MB),并启动abtesting。

ab -n 20000 -c 20000 -k http://website.com/banner.jpg 

从我在tcpdump中看到的,ab在执行GET之前build立所有连接。 所以我知道这些20k连接消耗了多less内存。

slabtop返回

  OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 40586 40586 100% 0.30K 3122 13 12488K ip_conntrack 

和顶部

  PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP CODE DATA COMMAND 15 0 862m 786m 780 S 22.9 3.3 1:44.86 76m 172 786m lighttpd 

ip_conntrack为12MB,lighttpd为786MB。 我可以轻松地pipe理4倍。

所以,Keepalive,即空闲超时设置为5秒。

为什么不把Keepalive超时设置为15秒? 我没有看到2分钟内保持连接的理由。 我不认为浏览器将保持连接2分钟根据这个链接: http : //en.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers,1分钟超时似乎更现实。

我build议非常低(1秒)保持活着超时。

如果你在客户端执行基本的工作(正确的JS / CSSsorting,JS底部或asynchronous…),你可以设置保持活着非常低(1秒),因为不会有太多的延迟2次重复使用您的TCP连接。

毫无疑问,网页testing你的页面5s和1s(连接视图),你会看到是否打破了TCP连接的重用。

我试图在Apache的前端将它设置为0,而且这个数目肯定是太小了,但是1的数目还是不错的