我的公司正在推出一个新网站,该网站在很短的时间内可能会吸引大量访问者(预计 2 分钟内将有大约 14,000 名访问者)。
因此,我正在检查我们的配置,目前最大的问题是使用 keep-alive 的单节点 HTTP 前端。前端在 CentOS 5.4 上运行 lighttpd 1.4。
一些假设:
- 浏览器通常会打开 6 个并行 TCP 连接来保持连接
- 即使标签页已关闭,浏览器也会保持连接打开,直到达到超时时间(在 FF 中观察到,但并非在每个浏览器上都是如此)
- 在服务器端,每个连接将消耗内核中约 150K 的内存(我使用 conntrack 并想保留它,这个估计正确吗?)
- 我们所有的服务器都托管在东海岸。来自拉斯维加斯服务器的 RTT 约为 80 毫秒。
- 启用 keep-alive 后,主页使用约 25 个 TCP 连接和 1500 个数据包。若不使用 keep-alive,则该数字上升到约 210 个 TCP 连接和超过 3200 个数据包。
因此,6*14000 = 84,000 个 TCP 连接。84,000 * 150KB ~= 12GB 内存。问题如下:1. 我没有那么多前端可用内存。2. lighttpd 1.4 不太适合管理那么多连接。这会严重影响点击率/sa。
但另一方面,如果我停用 keepalive,我担心 80ms RTT。
我打算使用 CDN 和辅助 lighttpd 的辅助 www 记录来缓解其中的一些问题。但争论涉及保持活动功能。我想关闭它,但我担心对页面打开时间的影响会很大(高 RTT,数据包数量增加一倍)。
一旦完成内容检索,我们就会收到大量用于浏览网站的 ajax 请求,这些请求通常包含在单个 tcp 连接中。但我不确定浏览器是否会释放其他连接,只保持一个连接打开。
我知道有很多关于保持活动状态会消耗太多资源的讨论。我有点同意这一点,但考虑到假设和情况(一半用户的 RTT 在 80 毫秒到 100 毫秒之间),您认为停用它是明智之举吗?
附带一个问题:您知道在哪里可以找到有关内核中的连接大小和 conntrack 大小的信息吗?(除了 printf size_of(sk_buff) )。
--- 编辑:一些测试结果我配置 conntrack 以接受 500k 个连接(考虑到内存占用,它不应超过 200MB)并启动 ab 测试。
ab -n 20000 -c 20000 -k http://website.com/banner.jpg
从我在 tcpdump 中看到的情况来看,ab 在执行 GET 之前建立了所有连接。因此,我知道这 20k 个连接消耗了多少内存。
板顶返回
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 就足够了。我可以轻松管理 4 倍。
因此,keepalive 的空闲超时设置为 5 秒。
答案1
为什么不将 keepalive 超时设置为 15 秒?我看不出有什么理由让每个连接都保持 2 分钟。而且根据此链接,我认为浏览器不会将连接保持 2 分钟:http://en.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers,1分钟的暂停似乎更加现实一些。
答案2
我建议将保持活动超时时间设置得非常低(1 秒)。
如果您在客户端性能上做了基本工作(正确排序 JS / CSS、JS 在底部或异步......),您可以将保持活动设置得非常低(1s),因为两次重用 TCP 连接之间不会有太多延迟。
如有疑问,请使用 5 和 1(连接视图)对您的页面进行网页测试,您将看到这是否会破坏 TCP 连接的重用。
我尝试在 Apache 前端将其设置为 0,这肯定太小了,但 1 很好