我在 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 使用率非常低。今天扩展我的流量的瓶颈是这个连接问题。
有谁知道我可以做些什么来正确处理它?