2015-05-13 13 views
5

Ich habe Lasttests für meine REST-APIs mit JMeter durchgeführt.So beheben Sie den Fehler java.net.SocketException: Zu viele geöffnete Dateien

Ich erhalte die folgende Fehlermeldung, wenn sie mit 1000 gleichzeitige Benutzer getroffen:

Too many open files. Stacktrace follows: 
java.net.SocketException: Too many open files 
    at java.net.Socket.createImpl(Socket.java:397) 
    at java.net.Socket.getImpl(Socket.java:460) 
    at java.net.Socket.setSoTimeout(Socket.java:1017) 
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:126) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:476) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:441) 
    at groovyx.net.http.HTTPBuilder.request(HTTPBuilder.java:390) 

Mein Server versucht, einen anderen REST-API zu treffen, die Daten zu erhalten und es zu verarbeiten und schließlich eine JSON-Antwort zurück.

Wie kann ich die Anzahl der geöffneten Dateien in Linux erhöhen?

Es folgt der Anruf, den ich auf einen anderen Server

Map getResponse(Map data, String url){ 
    HTTPBuilder httpBuilder = new HTTPBuilder(url); 
    httpBuilder.request(Method.POST, JSON) { 
     headers.'Authorization' = AppConfig.config.appKey; 
     headers.'Content-type' = 'application/json' 
     body = data 
     response.success = { resp, reader -> 
      return reader as Map; 
     } 
     response.failure = { response, reader -> 
      return null 
     } 
    } 
} 
+0

Does http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in-linux Hilfe? – immibis

+0

Sieht aus wie Dateien nicht geschlossen sind. Sende deinen Code hier. –

+1

Wahrscheinlich haben Sie viele Sockets erstellt, aber nicht geschlossen(). Ich denke, das Standardmaximum für offene Dateien und/oder Sockets auf Linux-Rechnern ist 1024. –

Antwort

4

Sie haben sicherlich die maximale Anzahl der geöffneten Datei/Sockets öffnen machen werde. Die maximale Anzahl geöffneter Dateien oder Sockets auf Linux-Computern ist 1024. Standardmäßig. Sie müssen das ändern. Sie können diese beziehen java.net.SocketException Too many open files

Sie unter Abfrage verwenden können, von Ihrem Terminal zu überprüfen, um zu bekommen maximal zulässige Anzahl von geöffneten Dateien

ulimit -n 

Von here:

Was passiert ist, dass die zugrunde liegenden Buchsen werden nicht geschlossen, und schließlich die JVM Bumps in das pro Prozesslimit des Systems auf offene Dateideskriptoren.

Die richtige Lösung der Steckdosen nahe an der rechten Zeit zu machen wäre (was ich denke, ist, wenn oder kurz nach hat der Server sein Ende der Verbindung geschlossen). Das scheint hart mit HttpURLConnection. Es ist alles sehr verwirrt:

  • disconnect() scheint nur sofort zu schließen - oder auch nicht; die Javadocs sind absichtlich vage darüber, was es tatsächlich tut, und vor allem, wenn es es tut.

  • Schließen() könnte die richtige Wahl sein. Der Evaluierungsabschnitt von Java-Fehler # 4147525 sagt: "... call close() auf der Eingabe und/oder Ausgabestrom. Dies wird korrekt in der zugrunde liegenden Socket wird geschlossen, wenn Sie Keepalive Verbindungen und nicht tun wird keepalive Verbindungen korrekt cachen und wiederverwenden (und die Zeitüberschreitung und schließen sich selbst nach einer kurzen Zeit sowieso). "

  • Aber vielleicht nicht. Fehler # 4142971 sagt: "Der Aufruf der close() Methoden hat keine Auswirkungen auf die eine oder andere Weise, ob die zugrunde liegende HTTP-Verbindung persistent ist."

eine klare Antwort Failing, vielleicht die HttpURLConnection Objekte zu einer Liste hinzugefügt werden könnten, und auf einmal am Ende des Tests Laufes getrennt. Das würde immer noch die Gesamtgröße des Laufs begrenzen, aber zumindest würden sich die verlorenen Deskriptoren nicht zwischen Läufen ansammeln.

Vielleicht ist die wirkliche Antwort, auf HttpURLConnection aufzugeben, und stattdessen den HTTP-Client von Jakarta Commons verwenden. Jemand hat vorgeschlagen, dass in Verbindung mit einem anderen Problem (Bug #4143518).

Verwandte Themen