- 问题
21-May-2019 15:49:55.773 严重 [http-nio-8088-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
java.io.IOException: 打开的文件过多
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:241)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:692)
at java.lang.Thread.run(Thread.java:745)
-
解决方法
方法一:找到server.xml文件修改配置<Connector connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443"/>
修改为:
<Connector port="8088" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" maxKeepAliveRequests="134" minProcessors="10" maxProcessors="1024" acceptCount ="1500" maxThreads ="1024" minSpareThreads ="25" maxSpareThreads ="1000" URIEncoding="UTF-8" redirectPort="8443" />
-
方法二:
增大用户允许打开的句柄数
1.使用ps -ef |grep tomcat 查看你的进程ID,记录ID号,假设进程ID为13714
2.使用:lsof -p 13714| wc -l 查看当前进程id为13714的 文件操作状况
执行该命令出现文件使用情况为 180
3.使用命令:ulimit -a 查看每个用户允许打开的最大文件数
发现系统默认的是open files (-n) 1024,问题就出现在这里。
4.然后执行:ulimit -n 4096
将open files (-n) 1024 设置成open files (-n) 4096 -
解释:
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
-
这两个值如何起作用,请看下面三种情况
情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处 理此请求。
情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。
情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求,返回connection refused杜绝假死,Tomcat容器做到自我保护,设置最大连接数
org.apache.tomcat.util.net.NioEndpoint,打开的文件过多