Jetty 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码头”,并看到了数百行:
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套接字接受器中,这是由大量连接请求引起的吗?     

解决方法

        尽管Jetty中可能存在错误,但我认为更可能的解释是打开文件的ulimit太低。通常,对于使用适度的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()的一些调用。