[英]Jetty IOException: Too many open files
我在网站上运行 Jetty,每秒处理大约 100 个请求,前面是 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 acceptor里面,请问这是连接请求风暴造成的吗?
虽然 Jetty 中可能存在错误,但我认为更可能的解释是您打开的文件 ulimits 太低了。 通常,1024 默认值对于中等使用的 web 服务器来说根本不够用。
对此进行测试的一个好方法是使用 apache 工作台来模拟您看到的入站流量。 在远程主机上运行它会生成 1000 个请求,每个请求超过 10 个并发连接。
ab -c 10 -n 1000 [http://]hostname[:port]/path
现在使用 .netstat 计算 web 服务器上的 sockets...
netstat -a | grep -c 192.168.1.100
希望您会发现您的 sockets 将稳定在某个不会显着大于 1024 的值(我的是 16384)。
要确保的另一件好事是连接在您的业务逻辑中正确关闭。
netstat -a | grep -c CLOSE_WAIT
如果您看到此数字在应用程序的整个生命周期内持续增长,则您可能错过了几次对 Connection.close() 的调用。
我通过将 Spring 引导升级到最新的 2.4.1 解决了由于 Spring 引导应用程序(版本 2.2.8 或 2.3.1)中的错误引起的类似问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.