2015-05-13 16 views
5

Ho eseguito test di carico per le mie API REST utilizzando JMeter.Come risolvere l'errore java.net.SocketException: Troppi file aperti

Sto ottenendo il seguente errore quando ha colpito con 1000 utenti contemporanei:

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) 

Il server cerca di colpire un altro REST API per ottenere i dati e di processo e, infine, restituire una risposta JSON.

Come aumentare il numero di file aperti in Linux?

seguito è la chiamata che sto facendo a un altro 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 aiuto? – immibis

+0

Sembra che i file non siano chiusi. Inserisci il tuo codice qui. –

+1

Probabilmente hai creato molti socket ma non li hai chiusi(). Penso che il massimo predefinito per i file aperti e/o socket su macchine Linux sia 1024. –

risposta

4

Hai certamente aprire il numero massimo di file aperti/prese. Il numero massimo di file o socket aperti su macchine Linux è 1024. per impostazione predefinita. Devi cambiarlo. È possibile fare riferimento questo java.net.SocketException Too many open files

È possibile utilizzare sotto query per controllare dal vostro terminale per ottenere il numero massimo consentito di file aperti

ulimit -n 

Da here:

Quello che sta succedendo è che le prese di fondo non vengono chiusi, e alla fine la JVM salta nel limite del processo per sistema sui descrittori di file aperti .

La soluzione corretta sarebbe quella di chiudere le prese al momento giusto (che immagino sia quando, o poco dopo, il server ha chiuso la connessione della ). Sembra difficile con HttpURLConnection. E 'tutto molto confuso:

  • disconnessione() sembra proprio per chiuderla subito - o no; i Javadoc sono intenzionalmente vaghi su ciò che effettivamente fa , e specialmente quando lo fa.

  • close() potrebbe essere la scelta giusta. La sezione Valutazione di Java bug # 4147525 dice: "... call close() sul flusso di input e/o output. Ciò causerà correttamente la chiusura del socket sottostante quando non si eseguono connessioni keepalive e cache e riutilizzare correttamente le connessioni keepalive (e che si interromperanno e si chiuderanno dopo un breve periodo comunque). "

  • Ma forse no. Il bug n. 4142971 dice: "La chiamata ai metodi close() non ha alcun effetto in un modo o nell'altro sul fatto che la connessione HTTP sottostante sia persistente."

In mancanza di una risposta chiara, forse gli oggetti potrebbero essere HttpURLConnection aggiunti ad una lista, e tutti in una volta scollegato al termine della prova corsa. Ciò limiterebbe comunque la dimensione totale della corsa, ma almeno i descrittori persi dello non si accumulerebbero tra le esecuzioni.

Forse la vera risposta è rinunciare a HttpURLConnection, e invece utilizzare il client HTTP da Jakarta Commons. Qualcuno ha suggerito che nella connessione con un altro problema (bug #4143518).

Problemi correlati