Jetée IOException: Trop de fichiers ouverts
Je me suis Jetée sur un site autour de 100 requêtes/sec, avec nginx en frontal. Je viens de remarquer dans les journaux, à quelques minutes seulement après avoir fait une de déployer et de départ de la Jetée, que pour un peu de temps il a été spamming:
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)
Pour une minute ou deux.
J'ai fait un "lsof-u jetée" et vu des centaines de lignes 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)
Où 192.168.1.100 est les serveurs IP interne.
Comme vous pouvez le voir, le nombre de fichiers ouverts par défaut de max de 1024. J'ai juste l'augmenter, mais je me demande pourquoi cela se produit en premier lieu? C'est dans la Jetée de nio socket accepteur, alors est-ce causé par une tempête de demandes de connexion?
La plupart de mes demandes ne prendre que quelques ms, bien que lorsque l'application démarre pour la première fois, ils peuvent prendre plusieurs secondes, ce qui est, je pense, ce qui s'y est passé. Le garbage collector également, à l'occasion de la "arrêtez le monde", une pause, ce qui provoque toutes les demandes à s'accumuler pendant une courte période de temps, l'origine de ce par intermittence. Je vais avoir à régler le GC plus tard, dans le temps, j'ai juste augmenté la limite.
Je suis arriver quelque chose de semblable dans Tomcat6 de temps en temps, d'abord pensé que c'était le système d'exploitation de jeter ses jouets. Aussi juste augmenté la limite comme un temp solution.
OriginalL'auteur John Smith | 2011-06-12
Vous devez vous connecter pour publier un commentaire.
Il y a peut être un bug dans la Jetée, je pense que beaucoup plus d'explication la plus probable est que votre fichier ouvert ulimits sont trop faibles. Généralement, le 1024 par défaut est tout simplement pas assez pour les serveurs web avec une utilisation modérée.
Un bon moyen de tester cela est de l'utilisation d'apache bench pour simuler le trafic entrant que vous vous voyez. L'exécution de ce sur un hôte distant va générer 1000 demandes de chacun plus de 10 connexions simultanées.
Maintenant compter les prises sur votre serveur web à l'aide de la commande netstat...
Espérons que vous trouverez, c'est que vos prises plateau à quelques pas de valeur considérablement plus grand que 1024 (le mien est à 16384).
Une autre bonne chose à vérifier est que les connexions sont correctement fermé dans une logique d'entreprise.
Si vous voyez ce nombre continuera de croître au cours du cycle de vie de votre application, vous avez peut-être manqué quelques appels à la Connexion.close().
OriginalL'auteur jpredham