【发布时间】: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