我刚刚让系统的所有用户尝试同时登录。我的服务器出现了这个错误:
SEVERE: Socket accept failed
Throwable occurred: java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:449)
at java.net.ServerSocket.implAccept(ServerSocket.java:473)
at java.net.ServerSocket.accept(ServerSocket.java:441)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:59)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:212)
at java.lang.Thread.run(Thread.java:736)
May 9, 2012 10:04:11 AM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
我运行了一个lsof命令来查看tomcat用户打开了哪些文件并获得了大量文件。大多数看起来很正常,但后来我遇到了大约700个相同文件的条目,这里有一个输出的片段:
java 12285 tomcat 256r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 257r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 258r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 259r REG 8,3 271669 1040879 /usr/share/tomcat7/shared/nmsc/icefaces-3.0.0.RC2.jar
java 12285 tomcat 260r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 261r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 262r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 263r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 264r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 265r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 266r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 267r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 268r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 269r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 270r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 271r REG 8,3 271669 1040879 /usr/share/tomcat7/shared/nmsc/icefaces-3.0.0.RC2.jar
java 12285 tomcat 272r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 273r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 274r REG 8,3 271669 1040879 /usr/share/tomcat7/shared/nmsc/icefaces-3.0.0.RC2.jar
java 12285 tomcat 275r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 276r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 277r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 278r REG 8,3 271669 1040879 /usr/share/tomcat7/shared/nmsc/icefaces-3.0.0.RC2.jar
java 12285 tomcat 279r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 280r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 281r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
java 12285 tomcat 282r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 283r REG 8,3 271669 1040879 /usr/share/tomcat7/shared/nmsc/icefaces-3.0.0.RC2.jar
java 12285 tomcat 284r REG 8,3 1470076 1040880 /usr/share/tomcat7/shared/nmsc/icefaces-ace-3.0.0.RC2.jar
java 12285 tomcat 285r REG 8,3 1955103 1040820 /usr/share/tomcat7/shared/nmsc/jsf-impl-2.1.4.jar
我提升了tomcat用户允许的文件句柄数量,以便让我度过早晨,但是为什么世界上tomcat会为每个HTTP请求打开一个新的icefaces和jsf副本(这似乎是发生了什么)而不是使用类加载器在启动时加载的文件的副本?我不知道从哪里开始排除故障。
答案 0 :(得分:0)
就个人而言,我开始使用探查器(我使用YourKit,因为它们为开源开发人员提供免费副本),获取内存快照,然后搜索这些文件名。这应该导致文件,URL或类似的对象,希望提供一些关于问题所在的线索。如果没有,您将需要开始跟踪对象分配,这是更昂贵但可行的。其他分析器可用;)
答案 1 :(得分:0)
我刚刚运行了ACE展示示例,并没有看到每个请求增加文件句柄的行为。您是否可以在应用程序中使用复合组件? Mojarra版本中存在一个错误,直到最近才修复(Mojarra 2.1.7)与核心复合组件类相关:
http://java.net/jira/browse/JAVASERVERFACES-2113
它记录了已打开但未关闭的InputStream。在Windows上,这会锁定文件并阻止重新部署它们。在其他系统上,这可能会解释您所看到的行为。
答案 2 :(得分:0)
您使用的是新的G1垃圾收集器吗?如果是这样,您可能在您的某个库或代码中发现了一个错误。新的G1垃圾收集器似乎不像以前的实现那样关闭文件。