java.io.IOException:tomcat 服务器上打开的文件过多

java.io.IOException:tomcat 服务器上打开的文件过多

我有一个基于 JAVA(GWT 框架)的 Web 应用程序。我将 Web 应用程序托管在 Redhat Linux Server 6.0 上,使用 Tomcat 8.0.9 位于使用 AJP 连接器和 JDK 8 连接的 apache http 服务器前面。每当有 20 多个用户访问我的网站时,Tomcat 就会失败,我检查了日志文件,发现出现了此异常

19-Oct-2015 12:38:15.350 SEVERE [ajp-nio-8009-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:241)
    at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:688)
    at java.lang.Thread.run(Thread.java:745)

Web 应用程序用途:

数据库 :couchdb 1.5(在使用 4gb RAM 的 ec-2 机器上运行)

搜索 :elasticsearch 1.0(在使用 4gb RAM 的 ec-2 机器上运行)

雄猫:使用 ajp 连接器连接的 apache 服务器前端的 Tomcat 8.0(在使用 8gb RAM 的 ec-2 机器上运行)

我搜索了很多,找到了解决方案,将 fs.file-max = 200000 的值以及软文件和硬文件限制更改为 65535,但仍然出现此错误并且 tomcat 停止响应。然后我需要重新启动 tomcat ec-2 机器,然后应用程序才能正常运行。

我不明白为什么这个问题频繁发生?

我的客户因为这个问题而恼火。请帮我解决这个问题

答案1

尝试增加打开文件的限制,如下所示(在/etc/security/limits.conf):

*         hard    nofile      65535
*         soft    nofile      200000

并重新启动您的服务。

您可以检查正在运行的进程的限制:

cat /proc/xxxx/limits

xxxx进程的 pid 在哪里

答案2

您需要检查 tomcat 进程如下:-

$ ps aux | grep apache:

我也遇到了同样的情况,但上述检查没有问题。我不得不备份 tomcat 日志目录中的某些文件。然后我强制终止了 tomcat 进程,如下所示:-

kill -9 <tomcat-process-id>

然后重新启动 tomcat,现在它可以正常工作了

相关内容