【问题标题】:Too many TIME_WAIT connections with Jetty与 Jetty 的 TIME_WAIT 连接过多
【发布时间】:2014-01-20 21:34:59
【问题描述】:

我在 10 台不同的服务器上运行 API,它们都位于防火墙后面。我正在使用 jetty 8 来服务所有的 http 请求。此 API 的用例是短期连接。

几个月前,我开始出现随机的Too many open file descriptors 错误。这些错误使服务器完全没有响应,我需要重新启动码头服务器才能解决这个问题。今天这种情况每天发生 0-10 次,具体取决于我获得的流量。

经过一些调查,我注意到我正在耗尽可用连接的数量,因为它们都停留在 TIME_WAIT 状态,因此我无法创建新连接。

ss -s

TCP:   13392 (estab 1549, closed 11439, orphaned 9, synrecv 0, timewait *11438*/0), ports 932

在此示例中,TIME_WAIT 状态的连接数非常少,但可以达到 50k。

我一直在尝试几个内核调整,我还尝试将 SO_LINGER 计时器设置为 1 秒用于码头套接字。所有这些更改都有助于降低频率,但我仍然经常收到错误。

另外值得一提的是,我在每台服务器上接收大约 3k 请求/秒,并且 cpu 使用率非常低。今天扩大我的流量的瓶颈是这个连接问题。

有没有人知道我可以做些什么来正确处理这个问题?

【问题讨论】:

  • 您是否对线程进行了线程转储,以查看它们在这些高峰期间在哪里等待?
  • @dcernahoschi 这些是进程状态和端口状态,而不是线程状态。你的问题无关紧要。

标签: java sockets http jetty jetty-8


【解决方案1】:

“打开的文件描述符过多”可能是由您的应用程序中的资源泄漏引起的。

TIME_WAIT 状态是由最先发送关闭消息的一端引起的,而不是最先收到关闭消息的一端。您可能需要重新考虑您的应用程序协议,以便它是首先关闭的客户端。这不是太难安排。例如,如果您使用客户端连接池,它就会免费。

这两个条件不相关。 TIME_WAIT 状态只能发生在其套接字已经关闭的端口上。它不会导致“打开文件描述符过多”的问题。

【讨论】:

  • TIME_WAIT 不意味着我是发起关闭的人吗?
  • 我可以把它放在前面,但它不会影响这与你的 FD 问题无关。
  • 谁先关闭达到TIME-WAIT状态。
  • @Jay 谢谢,你是对的,我早该在很久以前就修好了,现在就完成了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多