我在10个不同的服务器上运行API,它们都在防火墙后面。我使用jetty 8来提供所有的http请求。此API的用例是短期连接。
几个月前,我开始出现随机Too many open file descriptors
错误。这些错误使服务器完全没有响应,我需要重新启动jetty服务器以解决这个问题。今天这种情况每天发生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秒,用于jetty套接字。所有这些变化都有助于降低频率,但我仍然会定期收到错误。
另外值得一提的是,我在每台服务器上接收大约3k个请求/秒,并且CPU使用率非常低。今天扩大流量的瓶颈就是这个连接问题。
有没有人知道我能做些什么才能正确处理?
答案 0 :(得分:1)
'太多的打开文件描述符'可能是由应用程序中的资源泄漏引起的。
TIME_WAIT状态是由首先发送结束的结束而不是首先接收结束的结束引起的。您可能需要重新考虑您的应用程序协议,以便首先关闭它的客户端。这不是很难安排。如果您使用客户端连接池,它就会免费。
这两个条件无关。 TIME_WAIT状态只能在其套接字已关闭的端口上发生。它不会导致“太多打开文件描述符”的问题。