【发布时间】:2011-06-12 15:38:09
【问题描述】:
我在一个网站上运行 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中,所以这是连接请求风暴造成的吗?
【问题讨论】:
-
每个套接字都是一个文件,因此每个连接都有一个文件(描述符),即使它正在等待。请求通常会做什么,需要多长时间?码头上有 100 个请求/秒,查询本地数据库服务器需要 2 秒/请求,您已经有 400 个“文件”。
-
我的大多数请求只需要几毫秒,尽管当应用程序第一次启动时它们可能需要几秒钟,我认为这就是发生的情况。垃圾收集器也偶尔会“stop the world”暂停,这会导致所有请求在短时间内堆积起来,从而导致这种情况间歇性发生。稍后我将不得不调整 GC,同时我只是增加了限制。
-
我不时在Tomcat6中得到类似的东西,最初以为是操作系统扔了它的玩具。也只是增加了限制作为临时解决方案。
标签: java jetty nio ioexception