linux环境下当连接数过多时JBoss通常会出现如下的错误提示:
WARN [org.apache.tomcat.util.net.PoolTcpEndpoint] Reinitializing ServerSocket
ERROR [org.apache.tomcat.util.net.PoolTcpEndpoint] Endpoint ServerSocket[addr=/0.0.0.0,port=0,localport=8080] ignored exception: java.net.SocketException: Too many open files
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
at java.net.ServerSocket.implAccept(ServerSocket.java:450)
at java.net.ServerSocket.accept(ServerSocket.java:421)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.PoolTcpEndpoint.acceptSocket(PoolTcpEndpoint.java:407)
at org.apache.tomcat.util.net.PoolTcpEndpoint.run(PoolTcpEndpoint.java:647)
at java.lang.Thread.run(Thread.java:595)
原因:
linux中,每个socket连接都使用文件描述符进行标识,文件描述符属于系统资源,存在使用上的限制;缺省情况下JBoss能使用的最大描述符数是系统默认的最大文件描述符数(通过命令ulimit -H -n来获得),当连接数达到一定规模,使用的socket连接超过最大描述符的数量时就会出现此错误。
解决方法:
1、编辑$JBOSS_HOME/bin目录下的run.conf;
2、定位到:
#MAX_FD="maximum"
去掉注释,将其修改为所需的数值,例如:将文件描述符的最大值设置为10000;
MAX_FD=10000