java - jetty IOException : Too many open files

标签 java jetty nio ioexception

我在网站上运行 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里面,请问这是连接请求 Storm 导致的吗?

最佳答案

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

对此进行测试的一个好方法是使用 apache bench 来模拟您看到的入站流量。在远程主机上运行它会生成 1000 个请求,每个请求超过 10 个并发连接。

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() 的调用。

关于java - jetty IOException : Too many open files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6322823/

相关文章:

jsp - 在 Hadoop 中配置嵌入式 Jetty

java - RequestMappingHandlerAdapter': Invocation of init method failed; nested exception is java. lang.NoSuchMethodError

java - 尝试使用 Spark 数据集 (Java) 查找 2 个文件之间删除的记录时结果不一致

Solr 无法为 JSP 提供服务,管理界面 404s

java - 如何在生产中托管 Clojure 服务

java - Spring Integration - 用于大容量应用程序的可靠 TCP

java - 多个数据绑定(bind)错误

java - 为什么 Integer 在 Java 中不代表 NaN?

java - 我的 MINA 消息有什么问题?遍历 NioSocketConnector 并失败,导致 MINA 停止

java - 如何在 Java 代码中设置 TCP_CORK 选项