Nit*_*nil 5 java apache tomcat
我们在Amazon Linux中的Apache Tomcat中运行Web服务.最初,Web服务正常运行.在发出超过1000个Web请求后,我们收到太多打开文件异常.当我们重新启动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)
Run Code Online (Sandbox Code Playgroud)
PS:我们没有在Web服务中进行任何与文件相关的操作.
mar*_*des 10
看起来,打开文件有一些限制.当你在Linux上运行时,我怀疑你的文件描述符已经用完了.
检查ulimit命令以查看允许打开的文件数.
ulimit -n
Run Code Online (Sandbox Code Playgroud)
您可以通过编辑来更改打开文件的数量:
/etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)
并添加这样的东西:
* soft nofile 4096
* hard nofile 4096
Run Code Online (Sandbox Code Playgroud)
您可以在此处查看有关limits.conf的更多信息.
默认限制为1024,对于某些Java应用程序而言可能太低.
有关增加本文中最大打开文件数的更多信息,请访问:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
小智 5
虽然如果“ulimit”在某个点被提升,tomcat 将停止导致相同的错误。
因此,为了避免这种情况,您可以使用命令“lsof -u username”或简单地“lsof”检查 Linux 上应用程序用户的打开文件列表,并查看代码相关文件是否打开(例如..properties 文件),如果打开,则杀死使用 # kill -9 lsof -t -u username 命令为特定 tomcat 用户创建那些特定文件。
您需要修复代码以加载那些简单地写入类的静态块中的文件。因此,即使任意数量的用户进行了多次点击,也只会加载一个文件。
现在您可以在使用相同的 lsof 命令部署新更改后重新检查并查看。只会看到一个文件。这将永久解决您的问题,而不会每次都提高 ulimit