我在使用 tomcat 时遇到一个问题,总是收到“打开文件过多”的提示
25-Jul-2018 08:17:49.504 SEVERE [http-nio-443-exec-31] . /u01/app/ords/ords.18.1.1.95.1251/db_conf/m/url-mapping.xml: Too many open files
java.nio.file.FileSystemException: /u01/app/ords/ords.18.1.1.95.1251/db_conf/m/url-mapping.xml: Too many open files
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
我尝试将打开文件的 ulimit 提高到 65536,但这只会延长错误时间。
tomcat@tomcatserver():/home/tomcat> ulimit -a | grep open
open files (-n) 65536
我发现错误来自轮询数据库更改的 apex 应用程序。该应用程序每 3 秒轮询一次。如果我观察文件数,lsof | grep tomcat | wc-l
我可以看到应用程序打开时文件数增加,关闭时文件数保持稳定。当打开多个会话时,这个数字会迅速增长。
我可以在 server.xml 或 apex 端设置一些配置值来限制其保持打开的文件数量吗?如能提供任何帮助我将不胜感激。
笔记。
应用程序的连接正在关闭。我可以通过执行来看到这一点netstat -a | grep client_hostname
。我可以看到每 3 秒有一个额外的连接进入,然后消失。