【问题标题】:How to make long lasting TCP connections without killing server resources?如何在不杀死服务器资源的情况下建立持久的 TCP 连接?
【发布时间】:2012-05-12 18:08:54
【问题描述】:

我正在编写一个玩具示例来进行 NAT 遍历。对广泛使用的桌面应用程序如何做到这一点感兴趣,我使用了wireshark 来尝试分析它的流量。在对输出进行一些研究后,我意识到服务器通知(例如,“新文件添加到您的 xxx 文件夹”)使用某种 Comet 机制工作,具有长寿命的 HTTP 连接。但最让我吃惊的是,尽管流量很低(1 个 HTTP GET 及其每分钟的响应),但 TCP 连接从未关闭。我可以保证连接在至少 20 分钟内没有关闭。

到目前为止,我的理解是同时打开大量长寿命的 TCP 连接会很快消耗服务器的资源(主要是内存方面)。所以我的问题是,这种应用程序如何能够长时间有效地保持如此大量的 TCP 和 HTTP 连接同时打开?他们是否使用某种特殊的服务器?还是只需要添加硬件以进行水平扩展?

我用谷歌搜索了很多试图找到答案,但没有运气。也许我错过了一些非常明显的东西。

【问题讨论】:

  • "同时打开大量长寿命 TCP 连接会很快消耗服务器的资源(主要是内存方面)。"到底是什么让你这么想?
  • 也许我没有正确解释。打开该连接时,它使用的资源不能用于处理任何其他请求。据我了解,应该快速处理请求,以便再次释放资源来处理更多请求。我不明白这种应用程序如何有效地管理如此大量的持久连接。我的意思是,他们除了一味地增加服务器之外,还做了什么?
  • 不一定会消耗很多内存,但是这样的服务器进程需要对文件描述符有相当高的限制(因为每次调用accept()都会返回一个新的文件描述符)

标签: http connection


【解决方案1】:

也许你可以看看epoll (Linux)、kqueue(freebsd)、libev 和 libevent 来了解一下。

来自 epoll 的维基百科页面:“被监视的文件描述符的数量很大”。您可以用 TCP 套接字替换“监视的文件描述符”。

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 2011-10-26
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多