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?
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
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. –
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. –