2011-06-12 23 views
9

Estoy ejecutando Jetty en un sitio web haciendo alrededor de 100 solicitudes/seg, con nginx al frente. Acabo de notar en los registros, sólo unos minutos después de hacer un despliegue y puesta en el embarcadero, que por un tiempo fue el correo basura:Jetty IOException: Demasiados archivos abiertos

java.io.IOException: Too many open files 
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:163) 
    at org.mortbay.jetty.nio.SelectChannelConnector$1.acceptChannel(SelectChannelConnector.java:75) 
    at org.mortbay.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:673) 
    at org.mortbay.io.nio.SelectorManager.doSelect(SelectorManager.java:192) 
    at org.mortbay.jetty.nio.SelectChannelConnector.accept(SelectChannelConnector.java:124) 
    at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:708) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

Durante un minuto o dos. Me hicieron un "amarre lsof -u" y vio a cientos de líneas de:

java 15892 jetty 1020u IPv6   298105434  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60839 (ESTABLISHED) 
java 15892 jetty 1021u IPv6   298105438  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60841 (ESTABLISHED) 
java 15892 jetty 1022u IPv6   298105441  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60842 (ESTABLISHED) 
java 15892 jetty 1023u IPv6   298105443  0t0  TCP 192.168.1.100:http-alt->192.168.1.100:60843 (ESTABLISHED) 

, donde 192.168.1.100 es la IP interna servidores.

Como puede ver, esto trajo la cantidad de archivos abiertos al máximo predeterminado de 1024. Podría simplemente aumentar esto, pero me pregunto por qué sucede esto en primer lugar? Está en el aceptador de socket nio de Jetty, ¿esto es causado por una tormenta de solicitudes de conexión?

+1

Cada zócalo es un archivo, por lo que cada conexión tiene un archivo (descriptor) incluso si está esperando. ¿Qué hace típicamente una solicitud y cuánto tiempo lleva? Con 100 solicitudes/segundo en embarcadero, consultar a un servidor de db local tomando 2 s/request ya tiene 400 "archivos". – extraneon

+0

La mayoría de mis solicitudes toman solo unos pocos ms, aunque cuando la aplicación se inicia por primera vez pueden tardar varios segundos, que es lo que creo que sucedió allí. El recolector de basura también ocasionalmente hace la pausa "detener el mundo", lo que hace que todas las solicitudes se acumulen durante un corto período de tiempo, causando esto intermitentemente. Voy a tener que ajustar el GC más tarde, mientras tanto, simplemente aumente el límite. –

+1

Obtengo algo similar en Tomcat6 de vez en cuando, al principio pensé que era el sistema operativo el que arrojaba sus juguetes. También acaba de aumentar el límite como una solución temporal. –

Respuesta

11

Si bien puede haber un error en Jetty, creo que una explicación mucho más probable es que los archivos abiertos son demasiado bajos. Normalmente, el valor predeterminado 1024 simplemente no es suficiente para servidores web con un uso moderado.

Una buena manera de probar esto es utilizar apache bench para simular el tráfico entrante que está viendo. Ejecutar esto en un host remoto generará 1000 solicitudes cada una sobre 10 conexiones concurrentes.

ab -c 10 -n 1000 [http://]hostname[:port]/path 

Ahora cuente las tomas de corriente en su servidor web usando netstat ...

netstat -a | grep -c 192.168.1.100 

Con suerte lo que encontrará es que sus tomas se estabilizará en algún valor no dramáticamente superior a 1024 (el mío es en 16384).

Otra cosa buena que debe asegurarse es que las conexiones se cierren correctamente en su lógica comercial.

netstat -a | grep -c CLOSE_WAIT 

Si ve este número seguirá creciendo durante el ciclo de vida de la aplicación, es posible que falte un par de llamadas a Connection.close().

+0

Además, si resulta evidente que los GC completos realmente ocupan demasiado tiempo, eche un vistazo al recopilador ConcurrentMarkSweep de java. – jpredham

Cuestiones relacionadas