Ошибка слишком большого количества открытых файлов в Tomcat (Ubuntu 18.04) - PullRequest
0 голосов
/ 12 января 2019

Я развернул приложение Java Rest в tomcat (Ubuntu 18.04). Все кажется нормальным, пока эта ошибка не показывает:

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 / limit.conf file

* soft nproc 65535

* hard nproc 65535

* мягкий номер 65535

* жесткий номер файла 65535 root soft nproc 65535

root hard nproc 65535

root soft nofile 65535

root hard nofile 65535

webuser hard nofile 64000

Примечание. Это не утечка соединений с базой данных, поскольку я отслеживал открытые / активные соединения, и активных соединений не более 4.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема была с версией Tomcat. Версия 9.0.13 будет показывать ошибку «Слишком много открытых файлов», даже если общее количество открытых файлов было около 5000 из 100000 (ограничение). Я обновил версию до 9.0.14, и теперь все выглядит нормально.

0 голосов
/ 12 января 2019

Я предполагаю, что служба 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 status tomcat получить tomcat pid и

проверьте cat / proc / 'tomcat pid' / limit, если лимиты по-прежнему имеют значения по умолчанию, добавьте следующие строки в файл /etc/init.d/tomcat.

ulimit -Hn 16384

ulimit -Sn 16384

после изменения файла /etc/init.d/tomcat перезапустите службу tomcat, чтобы применить изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...