java.net.SocketException: Too many open files Spring Hibernate Tomcat
Ich habe eine Hibernate, Spring, Debian, Tomcat, MySql-stack auf einem Linode server in der Produktion mit einigen Kunden. Seine eine Feder-Multi-Tenant-Anwendung hostet Webseiten für über 30 Kunden.
Den Anwendungen beginnt gut, dann nach einer Weile, ich bin immer dieser Fehler:
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390)
at java.net.ServerSocket.implAccept(ServerSocket.java:453)
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.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:662)
Bevor dieser Fehler wird geworfen, jedoch von nagios-Alarmen mir, dass die pings der server nicht mehr reagiert.
Zuvor hatte ich nginx als proxy, und immer war das nginx-Fehler pro Anfrage statt, und musste neu starten tomcat sowieso:
2014/04/21 12:31:28 [error] 2259#0: *2441630 no live upstreams while connecting to upstream, client: 66.249.64.115, server: abril, request: "GET /catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox= HTTP/1.1", upstream: "http://appcluster/catalog.do?op=requestPage&selectedPage=-195&category=2&offSet=-197&page=-193&searchBox=", host: "www.anabocafe.com"
2014/04/21 12:31:40 [error] 2259#0: *2441641 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 200.74.195.61, server: abril, request: "GET /HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "www.oli-med.com"
Dies ist mein server.xml Stecker Konfiguration:
<Connector port="80" protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="500" minSpareThreads="250"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
acceptorThreadCount="2" />
Ich versucht, die änderung der ulimit mit dieses tutorial ich war in der Lage zu ändern hard-limit für Datei-Deskriptoren für das user tomcat läuft, aber es hat nicht das problem zu beheben, wird die Anwendung immer noch nicht reagiert.
Das Letzte mal, dass ich musste den server neu starten, Es lief über 3 Stunden, hatte ich diese Werte für socked geöffnete verbindungen:
lsof -p TOMCAT_PID | wc -l
632 (more or less!! i did not write the exact number)
Diese zahlen plötzlich beginnt Sie zu wachsen.
Habe ich einige Anwendungen, die sehr ähnlich wie diese auf anderen Servern, der Unterschied ist, dass Sie eine Stand-Alone-version und dies ist ein Multi-tenancy-Architektur, merke ich, dass in dieser app ich bin immer diese Art von socket-verbindungen, die nicht auftreten, in der Stand Alone version in einer der anderen Anlagen:
java 11506 root 646u IPv6 136862 0t0 TCP lixxx-xxx.members.linode.com:www->180.76.6.16:49545 (ESTABLISHED)
java 11506 root 647u IPv6 136873 0t0 TCP lixxx-xxx.members.linode.com:www->50.31.164.139:37734 (CLOSE_WAIT)
java 11506 root 648u IPv6 135889 0t0 TCP lixxx-xxx.members.linode.com:www->ec2-54-247-188-179.eu-west-1.compute.amazonaws.com:28335 (CLOSE_WAIT)
java 11506 root 649u IPv6 136882 0t0 TCP lixxx-xxx.members.linode.com:www->ec2-54-251-34-67.ap-southeast-1.compute.amazonaws.com:19023 (CLOSE_WAIT)
java 11506 root 650u IPv6 136884 0t0 TCP lixxx-xxx.members.linode.com:www->crawl-66-249-75-113.googlebot.com:39665 (ESTABLISHED)
java 11506 root 651u IPv6 136886 0t0 TCP lixxx-xxx.members.linode.com:www->190.97.240.116.viginet.com.ve:1391 (ESTABLISHED)
java 11506 root 652u IPv6 136887 0t0 TCP lixxx-xxx.members.linode.com:www->ec2-50-112-95-211.us-west-2.compute.amazonaws.com:19345 (ESTABLISHED)
java 11506 root 653u IPv6 136889 0t0 TCP lixxx-xxx.members.linode.com:www->ec2-54-248-250-232.ap-northeast-1.compute.amazonaws.com:51153 (ESTABLISHED)
java 11506 root 654u IPv6 136897 0t0 TCP lixxx-xxx.members.linode.com:www->baiduspider-180-76-5-149.crawl.baidu.com:31768 (ESTABLISHED)
java 11506 root 655u IPv6 136898 0t0 TCP lixxx-xxx.members.linode.com:www->msnbot-157-55-32-60.search.msn.com:35100 (ESTABLISHED)
java 11506 root 656u IPv6 136900 0t0 TCP lixxx-xxx.members.linode.com:www->50.31.164.139:47511 (ESTABLISHED)
java 11506 root 657u IPv6 135924 0t0 TCP lixxx-xxx.members.linode.com:www->ec2-184-73-237-85.compute-1.amazonaws.com:28206 (ESTABLISHED)
Sind Sie eine Art automatisierte verbindungen, die ich Schätze.
Also meine Frage ist:
Wie kann ich feststellen, ob das problem ist, weil mein code, server, oder irgendeine Art von Angriff und mit welchem Ansatz würden Sie empfehlen, um dies herauszufinden ?
Danke im Voraus 🙂
- maxThreads="10000" ist wirklich sehr optimistisch 😉
- jaja! du hast Recht, wahrscheinlich vergessen, setzen Sie es zurück, nachdem ein test oder so etwas. Danke für den Hinweis it out.
- Verändert es maxThreads="500" und aktualisiert die post. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, es stellt sich heraus, dass das problem war, dass der jdbc-Verbindung Einstellungen, hat maxActive 20 verbindungen, änderte ich das limit auf 200 und das problem gestoppt.
Den Weg ich dachte, das war das problem wurde Dank appdynamics.coms wunderbares Werkzeug, mit dem Sie überprüfen können, eine große Menge von Metriken in der ApplicationInfraestructurePerformance Metriken.
Auch, habe diesen wunderbaren Artikel über das Thema, was mir half, tune meine app:
http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency
die offiziele Dokumentation auch geholfen:
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html.
Ich denke, dass die ankommenden verbindungen begann eine Abfrage, die reduziert die server-Antwort-Fähigkeit zuerst, und danach füllte sich das OS-Buchse Grenzen, in linux, socket geöffnet werden öffnen von Dateien. Ich hoffe, das jemand hilft !
BEARBEITEN
Hallo! Diese Lösung behebt das Problem kurzfristig, aber ein weiterer Fehler in Bezug auf die JDBC-Verbindung erschien, wurde die Anwendung nicht schließen die verbindungen, die ich öffnete und löste ein ticket über dieses Problem hier
Haben Sie überprüft Ihre
ulimit
für den Benutzer läuft der tomcat?Linux hat ein limit von 1024 offene Dateien standardmäßig.
Mehr auf
Wie ändere ich die Anzahl der geöffneten Dateien zu begrenzen, die in Linux?
Gibt es eine Möglichkeit, Sie haben zu viele verbindungen in den configs oder Sie aus irgendeinem Grund nicht ordnungsgemäß schließen einige IO-streams(höchst unwahrscheinlich).
Ich würde den Ansatz durch die Erhöhung der
ulimit
und führen Sie dann etwas Last testen, um zu sehen, was der Aufstockung der Datei verwenden.ein bisschen spät, aber vielleicht eine Hilfe/Tipp für alle kämpfen mit diesem Problem. wir hatten das gleiche merkwürdige problem jedes jetzt und dann (unsere tomcat-Dienst neu gestartet wird jeden Tag in der Nacht (das reinigt die offene Griffe), also war der Fehler nicht passiert selten).
Wir verwenden einen apache-proxy mit ajp-Protokoll. Das problem war eine falsch-Protokoll-Implementierung.
Unser connector config ist nun die folgende:
Bitte beachtet diese: protocol="org.apache.coyote.ajp.AjpNioProtocol"
Diese Implementierung hat den trick für uns - keine offenen file-handles.
Weitere Informationen finden Sie hier: https://itellity.wordpress.com/2013/07/12/getting-rid-of-close_waits-in-tomcat-67-with-mod_proxy/
Ich hoffe, das jemand hilft.
Habt einen schönen Tag!