2

我在 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 使用率非常低。今天扩展我的流量的瓶颈是这个连接问题。

有谁知道我可以做些什么来正确处理它?

4

1 回答 1

1

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

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

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

于 2014-01-03T10:18:29.237 回答