我在10个不同的服务器上运行API,所有这些服务器都在防火墙后面。我使用jetty8来处理所有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。
我已经尝试了一些内核调整,我还尝试将jetty套接字的SO_LINGER计时器设置为1秒。所有这些变化都有助于降低频率,但我仍然经常出错。
同样值得一提的是,我在每台服务器上每秒收到大约3k个请求,cpu使用率非常低。今天扩展我的流量的瓶颈是这个连接问题。
有人知道我能做些什么来正确处理吗?
"打开的文件描述符过多"可能是由应用程序中的资源泄漏引起的。
TIME_WAIT状态是由第一个发送关闭的端而不是第一个接收关闭的端引起的。您可能需要重新考虑您的应用程序协议,以便首先关闭的是客户端。这并不难安排。例如,如果您使用客户端连接池,则它是免费的。
这两种情况并不相关。TIME_WAIT状态只能出现在套接字已关闭的端口上。它不会导致"打开的文件描述符过多"的问题。