錯誤信息:
27-Mar-2019 04:20:20.430 嚴重 [http-nio-8100-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:443) at java.lang.Thread.run(Thread.java:745)
辦法一:
<Server port="8002" shutdown="SHUTDOWN" >
<Service name="Catalina">
<Connector port="8100" connectionTimeout="20000" redirectPort="8443" acceptCount="1" protocol="HTTP/1.1" />
修改為:
<Server port="8002" shutdown="SHUTDOWN" >
<Service name="Catalina">
<Connector port="8100" connectionTimeout="20000" redirectPort="8443" acceptCount="100" protocol="HTTP/1.1" />
方法二:
增大用戶允許打開的句柄數
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
方法三:
操作系統的中打開文件的最大句柄數受限所致,常常發生在很多個並發用戶訪問服務器的時候.因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏.
1.盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄.
2.java的垃圾回收不能關閉網絡連接打開的文件句柄,如果沒有執行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關閉.你也可以考慮設置socket的最大打開數來控制這個問題.
3.
對操作系統做相關的設置,增加最大文件句柄數量
。