Tomcat太多打开文件错误(Ubuntu 18.04)

时间:2019-01-12 13:12:49

标签: java rest ubuntu tomcat

我已经在tomcat(ubuntu 18.04)中部署了Java Rest应用程序。一切正常,直到出现此错误为止:

java.io.FileNotFoundException: /opt/tomcat/webapps/botiv1/WEB-INF/lib/javax.inject-2.5.0-b42.jar (Too many open files)
    java.base/java.io.RandomAccessFile.open0(Native Method)
    java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:345)
    java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
    java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:214)
    java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1263)
    java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1229)
    java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:727)
    java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:845)
    java.base/java.util.zip.ZipFile.<init>(ZipFile.java:245)
    java.base/java.util.zip.ZipFile.<init>(ZipFile.java:175)
    java.base/java.util.jar.JarFile.<init>(JarFile.java:341)
    java.base/jdk.internal.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source)
    java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209)
    org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:149)
    org.apache.catalina.webresources.AbstractArchiveResourceSet.openJarFile(AbstractArchiveResourceSet.java:307)
    org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:97)
    org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:256)
    org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281)
    org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
    org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216)
    org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:225)
    org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2260)
    org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:834)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1297)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
    org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:422)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:285)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
    org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    org.glassfish.jersey.internal.Errors.process(Errors.java:268)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    com.ritech.model.CORSFilter.doFilter(CORSFilter.java:59)

我已将限制设置为65000,但几个小时后仍然显示此错误。

/etc/security/limits.conf文件

* soft nproc 65535

* hard nproc 65535

* soft nofile 65535

*硬nofile 65535 根软nproc 65535

root hard nproc 65535

root soft nofile 65535

root hard nofile 65535

webuser硬nofile 64000

注意:这不是数据库连接泄漏,因为我已经跟踪了打开/活动的连接,并且活动连接不超过4个。

2 个答案:

答案 0 :(得分:2)

我假设tomcat服务在tomcat用户下运行。 使用命令lsof -u tomcat | wc -l检查打开的文件 使用以下命令检查整个系统的最大文件句柄数:cat /proc/sys/fs/file-max

使用以下命令检查文件句柄的当前使用情况:cat /proc/sys/fs/file-nr

要使更改永久生效,请在文件/etc/sysctl.conf中添加或更改以下行。该文件在引导过程中使用。 echo "fs.file-max=65536" >> /etc/sysctl.conf(值在重新启动后有效)

运行命令ulimit -a并检查打开的文件数(-n)和最大用户进程(-u) 如有必要,增加值。

e.g. : in /etc/security/limits.conf file 
tomcat              hard    nofile          102400
tomcat              soft    nofile          102400

运行命令:systemctl状态为tomcat 得到tomcat pid

检查cat / proc /'tomcat pid'/ limits,如果限制仍为默认值,请在/etc/init.d/tomcat文件中添加以下行。

ulimit -Hn 16384

ulimit -Sn 16384

更改/etc/init.d/tomcat文件后,重新启动tomcat服务以应用更改。

答案 1 :(得分:0)

问题出在Tomcat版本。 9.0.13版将显示“打开的文件太多”错误,即使打开的文件总数在100000个(限制)中也有5000个左右。我将版本更新为9.0.14,现在一切似乎都很好。