2016-04-26 90 views
3

我们在Amazon Linux中的Apache Tomcat中运行Web服务。最初,Web服务正常运行。在制作超过1000个网络请求后,我们得到的打开文件异常太多。当我们重新启动tomcat服务器时,这个问题再次得到解决。Apache Tomcat异常 - 打开的文件太多

请查找异常下面

25-Apr-2016 10:05:52.628 SEVERE [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed 
java.io.IOException: Too many open files 
     at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) 
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) 
     at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:686) 
     at java.lang.Thread.run(Thread.java:745) 

PS:我们不是在做Web服务相关的操作的任何文件。

+0

您是否使用tomcat搜索太多打开的文件? –

+0

你在使用什么操作系统? –

+0

我们使用亚马逊Linux –

回答

6

看起来,打开的文件有一些限制。当你在Linux上运行时,我怀疑你用完了文件描述符。

查看ulimit命令查看允许打开的文件的数量。

ulimit -n 

您可以通过编辑更改打开的文件数:

/etc/security/limits.conf 

,并添加这样的:

* soft nofile 4096 
* hard nofile 4096 

您可以查看更多关于limits.conf中here

默认限制为1024,对于某些Java应用程序可能太低。

关于增加在这篇文章中的打开文件的最大数量的详细信息:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/

2

这是因为套接字连接被视为文件,所以这意味着您打开的连接太多。检查限制(每个操作系统有不同的策略 - 每个服务器也是如此),可以同时打开多少个端口等。您可以使用NIO限制这些内容。

1

虽然如果“的ulimit”在某些时候下了线Tomcat是提出停止导致同样的错误。

因此,为了避免这种情况,您可以使用命令“lsof -u username”或简单的“lsof”来检查应用程序用户在Linux上打开的文件列表,并查看代码相关文件是否打开(例如..properties文件)如果是这样,请使用#kill -9 lsof -t -u username命令为特定的tomcat用户杀死这些特定文件。

你需要修复你的代码来加载这些文件,只是写在你的类的静态块中。因此,即使任何数量的用户创建了多个匹配,也只会加载一个文件。

现在您可以在使用相同的lsof命令部署新更改后再次查看。只会看到一个文件。这将永久解决您的问题,而不会每次提高ulimit

相关问题