【问题标题】:Undertow on Spring leaks connectionsUndertow on Spring 泄漏连接
【发布时间】:2015-12-04 19:41:53
【问题描述】:

我正在使用带有 Undertow 的 Spring Boot (1.3.O.M5)。最近,我发现当我使用的时候

lsof -p $(pidof java)

几个小时后的命令,它向我显示了大约 700 行,其中大部分是与客户端建立的 TCP 连接,尽管最近一个小时内几乎没有人进入该页面(当我连接到该站点时,我的连接是大约 5 分钟后消失)。

这很可能是我的 java.net.SocketException 的来源:打开的文件太多 - 在我注意到陈旧的连接之前,我每隔几天就会收到一次(要求我重新启动应用程序)。我增加了系统中的最大打开文件限制,但这显然是一个短期的解决方案。

非常感谢您对这个问题的帮助。谢谢!

【问题讨论】:

  • 另外,带有 setSessionTimeout(3) 的 UndertowEmbeddedServletContainerFactory bean 没有将会话超时缩短到 3 秒。 server.session.timeout=3 也没有 :(
  • 什么样的连接?外部的?到内部系统?找出连接以了解它正在发生的应用程序的哪一部分。会话超时也适用于 HTTP 会话,对连接没有任何作用。
  • 这是我看到房产后的想法。不过,尝试永远不会有坏处。这些连接只是与访问该网站的设备的 TCP 连接。
  • 保持连接打开的设备可能取决于设备/操作系统吗?已经有一段时间了,但可能有一些方法可以在服务器上设置连接超时或关闭非活动连接。
  • 我不知道。连接似乎是通过移动网络建立的(我可以在地址中看到运营商的名称 - 至少在绝大多数情况下),这就是我对它们的全部了解。

标签: java spring connection undertow connection-leaks


【解决方案1】:

Undertow 没有默认的连接超时,您需要使用以下方式设置它:

Undertow.builder().setServerOption(UndertowOptions.NO_REQUEST_TIMEOUT, 60000)

这将告诉 Undertow 在 60 秒后关闭连接,并且没有来自客户端的请求。

【讨论】:

  • 我刚刚在上游的 Undertow 中将其更改为默认为 10 分钟,请参阅 issues.jboss.org/browse/UNDERTOW-630
  • 我在 Application.main 中设置了它,就在我启动 SpringApplication... 并写下这个之后,我意识到我可能应该在启动应用程序之前这样做 - 但它不起作用 ATM .在 prod 中启动应用程序时,我有 200 个打开的文件,现在有 600 个文件,大约有 7 台设备访问该网站。
【解决方案2】:

尝试设置httpServerExchange.setPersistent(false);,当我遇到同样的问题时它会帮助我。是的 - 它会导致打开文件过多错误,因为它超出了文件描述符的限制

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2017-10-16
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多