代码之家  ›  专栏  ›  技术社区  ›  Sean Owen

多个完整的HTTP请求卡在TCP关闭等待状态

  •  0
  • Sean Owen  · 技术社区  · 15 年前

    我有一个基于Java和Tomcat的服务器应用程序,它启动许多向外HTTP请求到其他网站。我们使用雅加达的HTTP核心/客户端库,非常新的版本。

    由于服务器的所有工作线程都在尝试关闭已完成的HTTP连接时卡住,因此服务器在某个时间锁定。使用“lsof”可以显示一组卡在TCP关闭等待状态的套接字。

    这并不是所有人,甚至大多数人都会发生。实际上,我以前看到过它,并通过确保设置连接来解决它:关闭响应头。所以我认为这可能是远程服务器的不良行为。

    自从我把这个应用程序转移到一个全新的服务提供商——不同的操作系统,不同的网络环境之后,它可能又出现了。

    但是,我仍然不知道我能做些什么,如果有的话,来解决这个问题。有些人在互联网上闲逛,没有发现我还没做的事情。我只是想问问有没有人看到并解决了这个问题?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Matt Ball    15 年前

    我不知道你对TCP了解多少。一个TCP客户端最终会在 CLOSE_WAIT 当它在 ESTABLISHED 状态并接收 FIN 小包裹。这个 关闭等待 状态表示它正在等待接收 close 来自应用层的命令-在本例中,这意味着它正在等待 close() 在套接字上调用。

    所以,我想应该是那个电话 关闭() 在工作线程中可以解决问题。或者你已经这样做了?

        2
  •  2
  •   erlando    13 年前

    我相信我可能找到了一个解决方案——至少,这些变化,加在一起,似乎使问题消失了。

    • 从httpEntity.consumeContent()的inputstream中读取完后,调用它,以再次检查内容是否已被使用以及框架是否释放了连接。
    • 为了更好的度量,我在这之后调用了clientConnectionManager.closeExpiredConnections()和clientConnectionManager.closeIdleConnections(0l,timeUnit.millises),以便立即按框架释放所做的任何操作。这可能有点过头了。

    好吧,上面的技巧不太管用。最后,我不得不使用一个单独的clientconmanager,为每个请求创建并关闭它。这就成功了。我假设这是确保连接关闭所需的。