我有一个基于 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,现在它可以正常工作了