保活或不保活

Jul*_*ent 7 performance lighttpd keepalive

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

所以,我正在审查我们的配置,我现在最大的问题是我们使用 keep-alive 的单节点 HTTP 前端。前端在 CentOS 5.4 上运行 lighttpd 1.4。

一些假设:

  • 浏览器通常会打开 6 个并行 TCP 连接以保持活动状态
  • 浏览器将保持连接打开直到超时,即使选项卡已关闭(在 FF 中观察到,可能并非在每个浏览器上都如此)
  • 在服务器端,每个连接将消耗内核中约 150K 的内存(我使用 conntrack 并想保留它,这个估计是否正确?)
  • 我们所有的服务器都托管在东海岸。来自拉斯维加斯服务器的 RTT 大约为 80 毫秒。
  • 带有 keep-alive 的主页使用了大约 25 个 TCP 连接和 1500 个数据包。如果没有保持连接,这个数字会上升到大约 210 个 TCP 连接和超过 3200 个数据包。

因此,6*14000 = 84,000 个 TCP 连接。84,000 * 150KB ~= 12GB 内存。问题是: 1. 我在前端没有那么多可用的内存。2. lighttpd 1.4 对要管理的连接数量不是很满意。它伤害了命中/很多。

但另一方面,如果我停用 keepalive,我会担心 80 毫秒的 RTT。

我将通过 CDN 和带有辅助 lighttpd 的辅助 www 记录来缓解其中的一些问题。但辩论涉及保持活动功能。我想关闭它,但我担心对页面打开时间的影响会很大(RTT 高,数据包数量翻倍)。

内容检索完成后,我们有很多 ajax 请求用于浏览通常适合单个 tcp 连接的站点。但我不确定浏览器是否会释放其他连接并保持打开状态。

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

作为一个附带问题:您知道在哪里可以找到有关内核中连接大小和连接轨道大小的信息吗?(除了 printf size_of(sk_buff) )。

--- 编辑:一些测试结果我将 conntrack 配置为接受 500k 连接(考虑到内存占用,它不应超过 200MB)并启动 ab 测试。

ab -n 20000 -c 20000 -k http://website.com/banner.jpg
Run Code Online (Sandbox Code Playgroud)

从我在 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
Run Code Online (Sandbox Code Playgroud)

和顶部

 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
Run Code Online (Sandbox Code Playgroud)

12MB 的 ip_conntrack 和 786MB 的 lighttpd 适合我的设置。我可以轻松管理 4 倍。

因此,keepalive 即空闲超时设置为 5 秒。

Ale*_*lex 1

为什么不将 keepalive 超时设置为 15 秒?我不认为有理由将每个连接保持 2 分钟。而且我认为浏览器不会根据此链接保持连接 2 分钟:http://en.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers,1 分钟超时似乎更现实。