2016-04-26 88 views
3

我們在Amazon Linux中的Apache Tomcat中運行Web服務。最初,Web服務正常運行。在製作超過1000個網絡請求後,我們得到的打開文件異常太多。當我們重新啓動tomcat服務器時,這個問題再次得到解決。Apache Tomcat異常 - 打開的文件太多

請查找異常下面

25-Apr-2016 10:05:52.628 SEVERE [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$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:422) 
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) 
     at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:686) 
     at java.lang.Thread.run(Thread.java:745) 

PS:我們不是在做Web服務相關的操作的任何文件。

+0

您是否使用tomcat搜索太多打開的文件? –

+0

你在使用什麼操作系統? –

+0

我們使用亞馬遜Linux –

回答

6

看起來,打開的文件有一些限制。當你在Linux上運行時,我懷疑你用完了文件描述符。

查看ulimit命令查看允許打開的文件的數量。

ulimit -n 

您可以通過編輯更改打開的文件數:

/etc/security/limits.conf 

,並添加這樣的:

* soft nofile 4096 
* hard nofile 4096 

您可以查看更多關於limits.conf中here

默認限制爲1024,對於某些Java應用程序可能太低。

關於增加在這篇文章中的打開文件的最大數量的詳細信息:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/

2

這是因爲套接字連接被視爲文件,所以這意味着您打開的連接太多。檢查限制(每個操作系統有不同的策略 - 每個服務器也是如此),可以同時打開多少個端口等。您可以使用NIO限制這些內容。

1

雖然如果「的ulimit」在某些時候下了線Tomcat是提出停止導致同樣的錯誤。

因此,爲了避免這種情況,您可以使用命令「lsof -u username」或簡單的「lsof」來檢查應用程序用戶在Linux上打開的文件列表,並查看代碼相關文件是否打開(例如..properties文件)如果是這樣,請使用#kill -9 lsof -t -u username命令爲特定的tomcat用戶殺死這些特定文件。

你需要修復你的代碼來加載這些文件,只是寫在你的類的靜態塊中。因此,即使任何數量的用戶創建了多個匹配,也只會加載一個文件。

現在您可以在使用相同的lsof命令部署新更改後再次查看。只會看到一個文件。這將永久解決您的問題,而不會每次提高ulimit

相關問題