2016-04-26 11 views
3

Wir betreiben einen Webdienst in Apache Tomcat in Amazon Linux. Anfangs läuft der Web-Service ordnungsgemäß. Wir erhalten zu viele offene Dateien, nachdem mehr als 1000 Web-Anfragen erstellt wurden. Auch dieses Problem wird behoben, wenn wir den Tomcat-Server neu starten.Apache Tomcat Exception - Zu viele geöffnete Dateien

finden Sie unter der Ausnahme

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: wir sind alle Dateien nicht zu tun in dem Web-Service-bezogene Operationen.

+0

Haben Sie Tomcat zu viele offene Dateien gegooglet? –

+0

Welches Betriebssystem verwendest du? –

+0

Wir verwenden Amazon Linux –

Antwort

6

Offenbar gibt es ein Limit für offene Dateien. Da Sie mit Linux arbeiten, habe ich den Verdacht, dass Ihnen die Dateideskriptoren ausgehen.

Überprüfen Sie den ulimit-Befehl, um die Anzahl der zulässigen geöffneten Dateien anzuzeigen.

ulimit -n 

Sie können die Anzahl der geöffneten Dateien durch Bearbeitung ändern:

/etc/security/limits.conf 

und das Hinzufügen von etwas wie folgt aus:

* soft nofile 4096 
* hard nofile 4096 

Sie mehr über limits.conf here überprüfen.

Das Standardlimit ist 1024 und kann für einige Java-Anwendungen zu niedrig sein.

Mehr Informationen über die maximale Anzahl von geöffneten Dateien in diesem Artikel zu erhöhen: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/

2

Dies ist, weil Socket-Verbindungen als Dateien behandelt werden, so dass Sie zu viele Verbindungen geöffnet haben. Überprüfen Sie die Einschränkungen (jedes Betriebssystem hat eine andere Richtlinie - das gilt für jeden Server), wie viele Ports Sie gleichzeitig öffnen können usw. Sie können NIO verwenden, um diese Dinge zu begrenzen.

1

Obwohl, wenn „ulimit“ wird an einem gewissen Punkt der ganzen Linie tomcat stoppt verursacht gleiche Fehler ausgelöst.

Um dies zu vermeiden, können Sie die Liste der geöffneten Dateien für den Anwendungsbenutzer unter Linux mit dem Befehl "lsof -u username" oder einfach "lsof" überprüfen und prüfen, ob Code-Dateien geöffnet sind (zB .properties-Dateien)) Wenn dies der Fall ist, töten Sie diese speziellen Dateien mit dem Befehl # kill -9 lsof -t -u username für diesen speziellen Tomcat-Benutzer.

Sie müssen Ihren Code reparieren, um diese Dateien einfach in einem statischen Block Ihrer Klassen zu schreiben. So dass nur eine Datei geladen wird, auch wenn mehrere Treffer von einer beliebigen Anzahl von Benutzern erstellt wurden.

Jetzt können Sie erneut nach dem Bereitstellen neuer Änderungen mit dem gleichen lsof-Befehl überprüfen und sehen. Nur eine Datei wird angezeigt. Dies wird dauerhaft Ihr Problem beheben, ohne die ulimit jedes Mal zu erhöhen

Verwandte Themen