繁体   English   中英

Jetty IOException:打开的文件太多

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM