Jetty IOException:打开的文件太多

时间:2011-06-12 15:38:09

标签: java jetty nio ioexception

我在一个大约100个请求/秒的网站上运行Jetty,前面有nginx。我刚刚在日志中注意到,在部署和启动Jetty后的几分钟内,有一段时间它就是垃圾邮件:

java.io.IOException: Too many open files
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:163)
    at org.mortbay.jetty.nio.SelectChannelConnector$1.acceptChannel(SelectChannelConnector.java:75)
    at org.mortbay.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:673)
    at org.mortbay.io.nio.SelectorManager.doSelect(SelectorManager.java:192)
    at org.mortbay.jetty.nio.SelectChannelConnector.accept(SelectChannelConnector.java:124)
    at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:708)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

一两分钟。 我做了一个“lsof -u jetty”并看到了数百行:

java    15892 jetty 1020u  IPv6          298105434        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60839 (ESTABLISHED)
java    15892 jetty 1021u  IPv6          298105438        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60841 (ESTABLISHED)
java    15892 jetty 1022u  IPv6          298105441        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60842 (ESTABLISHED)
java    15892 jetty 1023u  IPv6          298105443        0t0       TCP 192.168.1.100:http-alt->192.168.1.100:60843 (ESTABLISHED)

其中192.168.1.100是服务器内部IP。

正如你所看到的,这使得打开文件的数量达到默认最大值1024.我可以增加这个,但我想知道为什么会发生这种情况?它在Jetty的nio socket接受器中,这是由连接请求风暴引起的吗?

2 个答案:

答案 0 :(得分:11)

虽然Jetty中可能存在错误,但我认为更可能的解释是您的打开文件ulimits太低。通常,对于具有适度使用的Web服务器,1024默认值是不够的。

测试此方法的一个好方法是使用apache bench来模拟您看到的入站流量。在远程主机上运行此命令将在10个并发连接中生成1000个请求。

ab -c 10 -n 1000 [http://]hostname[:port]/path

现在使用netstat ...

计算Web服务器上的套接字
netstat -a | grep -c 192.168.1.100

希望你能找到的是你的插座会在某个值不会大于1024的情况下达到稳定水平(我的是16384)。

确保另一件好事是在业务逻辑中正确关闭连接。

netstat -a | grep -c CLOSE_WAIT

如果您看到此数字在应用程序的生命周期中继续增长,则可能会缺少对Connection.close()的一些调用。

答案 1 :(得分:0)

我通过将 Spring Boot 升级到最新的 2.4.1 解决了由于 Spring Boot 应用程序(版本 2.2.8 或 2.3.1)中的 bug 而引起的类似问题