【发布时间】:2021-09-20 03:49:28
【问题描述】:
不确定限制设置为 4096 可能有什么问题,我正在使用 Apache Tomcat/9.0.26 我认为扩展限制不是一个选项,因为问题出在 tomcat-users.xml
tomcat-users.xml:
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
20-Sep-2021 03:20:15.225 WARNING [Catalina-utility-1] org.apache.catalina.users.MemoryUserDatabase.backgroundProcess Failed to close [conf/tomcat-users.xml]
java.io.FileNotFoundException: /opt/tomcat/conf/tomcat-users.xml (Too many open files)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
at org.apache.catalina.users.MemoryUserDatabase.backgroundProcess(MemoryUserDatabase.java:685)
at org.apache.catalina.realm.UserDatabaseRealm.backgroundProcess(UserDatabaseRealm.java:143)
at org.apache.catalina.realm.CombinedRealm.backgroundProcess(CombinedRealm.java:299)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1137)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1353)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1335)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
20-Sep-2021 03:20:16.017 SEVERE [http-nio-8080-Acceptor] org.apache.tomcat.util.net.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:419)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:247)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:463)
at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:73)
at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95)
at java.lang.Thread.run(Thread.java:748)
【问题讨论】:
-
您的 web 应用程序中存在文件描述符泄漏。检查正在打开但未关闭的套接字和文件。将 try-with-resources 撒在 任何地方 以确保它发生。
-
是在Tomcat启动过程中还是一段时间后出现?
tomcat-users.xml由服务器定期重新加载。我的猜测是:1.服务器达到了打开文件的限制(maxConnections默认是8192,所以超过了操作系统限制),2.Tomcat试图重新加载tomcat-users.xml。 -
一段时间后会发生
-
不会是 Tomcat 泄露这些资源,而是您的代码。 @PiotrP.Karwasz
-
@user207421:Tomcat 不会泄漏资源,但打开的套接字是 UNIX 上的文件描述符。在我看来,4096 个未关闭的文件比 4096 个并发连接更不可信,尽管两者都可能发生。