10
votes

java.net.socktException: trop de fichiers ouverts printemps hibernate tomcat

J'ai une pile Hibernate, printemps, debian, Tomcat, MySQL sur un serveur Linode en production avec certains clients. C'est une application à ressort multiples qui héberge des pages Web pendant environ 30 clients.

Les applications commencent bien, puis après un certain temps, je reçois cette erreur: xxx

avant cette erreur est jeté cependant, Nagios m'interse ce qui pings au serveur arrêter de répondre.

Auparavant, j'avais Nginx comme proxy et obteniez ces erreurs Nginx par demande et devait redémarrer Tomcat quand même: xxx

ceci est ma configuration de connecteur Server.xml: xxx

J'ai essayé de changer l'ulimit en utilisant Ce tutoriel a pu changer la limite dure du fichier ouvert descripteurs pour l'utilisateur exécutant tomcat, mais il n'a pas corrigé le problème, l'application est toujours suspendue.

La dernière fois que je devais redémarrer le serveur, il a couru environ 3 heures, j'ai eu ces valeurs pour connexions ouvertes chaussettes: xxx

Ce chiffre commence soudainement à grandir.

J'ai Certaines applications sont très similaires à celle-ci sur d'autres serveurs, la différence est qu'elles sont une version autonome et c'est une architecture multi-entreprises, je remarque que dans cette application, je reçois ces types de connexions de socket, qui ne se produisent pas dans le support Version seule de l'une des autres installations: xxx

Ils sont une sorte de connexions automatisées je suppose.

Donc, ma question est la suivante:

Comment puis-je déterminer si le problème est à cause de mon code, de mon serveur ou d'une sorte d'attaque et de quelle approche recommanderiez-vous de comprendre cela?

Merci d'avance :)


3 commentaires

maxthreads = "10000" est vraiment optimiste;)


Jaja! Vous avez raison, probablement oublié de le remettre après un test ou quelque chose. Je vous remercie de le faire remarquer.


Changé-le sur Maxthreads = "500" et mis à jour le poste. :)


3 Réponses :


2
votes

Avez-vous vérifié votre ulimit pour l'utilisateur qui tourne tomcat? Linux a une limite de 1024 fichiers ouverts par défaut. Plus sur Comment changer le nombre d'ouvertures Limite de fichiers sous Linux?

Il est possible que vous ayez une possibilité que vous avez trop de connexions dans les configs ou pour une raison quelconque, vous ne fermez pas correctement certains flux IO (higly improbable).

Je l'aborderais en augmentant le ulimit , puis exécutez un test de charge pour voir ce qui suit l'utilisation du fichier.


3 commentaires

Bonjour Mite, merci pour la réponse ... J'ai changé l'ulimit, j'ai écrit à ce sujet dans le message d'origine, après la description du connecteur Server.xml. Je l'a élevé à 65535. Je n'ai pas reçu cette erreur, mais le Tomcat a arrêté de répondre, et les fichiers ouverts se levaient. J'aurais probablement obtenu cette erreur si j'avais laissé tomber seul, mais j'ai dû redémarrer. J'ai essayé des tests de chargement avec JMeter, si je mets beaucoup de demande par seconde, il ralentit, mais je ne sais pas comment détecter ce qui le causera.


Lorsque vous exécutez LSOF -P TOMCAT_PID Quels sont les fichiers ouverts, connexions ou autre chose?


Bonjour Mite, principalement des connexions, comme des robots et des webcrawlers, je pense. Je viens de faire un script qui regardera quand cela se produit et enregistre la sortie de -p tomcat_pid afin que je puisse vous donner une réponse précise. Merci encore d'avoir répondu. Je vais mettre à jour avec plus d'informations bientôt



7
votes

OK, il s'avère que le problème était que les paramètres de connexion JDBC sont définis Maxactive sur 20 connexions, j'ai modifié la limite à 200 et le problème arrêté.

La façon dont j'ai pensé que c'était le problème, c'est grâce à l'outil merveilleux d'Appdynamics.com, ce qui vous permet de vérifier une grande quantité de métriques dans les métriques ApplicationInfreReStructurePourance.

Aussi, a trouvé cet article merveilleux sur le sujet qui m'a aidé à syntoniser mon application:

http: //www.tomcatexpert .Com / Blog / 2010/04/01 / Configuration-JDBC-Pool-Concurrence

La documentation de l'OFICIAL a également aidé:

https://tomcat.apache.org/tomcat-7.0 -doc / jdbc-piscine.html .

Je suppose que les connexions arrivantes ont démarré une requête qui a effondré la capacité de réponse du serveur en premier et remplissait ensuite les limites de prise de système d'exploitation, sous Linux, Open Socket sont des fichiers ouverts. J'espère que cela aide quelqu'un!

Modifier

Bonjour! Cette solution a résolu la question à court terme, mais une autre erreur concernant la connexion JDBC est apparue, l'application ne fermait pas les connexions, j'ai ouvert et résolu un billet concernant ce problème Voici


0 commentaires

0
votes

Un peu en retard, mais peut-être une aide / conseil pour que quiconque luttait avec cette question. Nous avons eu le même problème étrange de temps en temps (notre service Tomcat est redémarré tous les jours la nuit (qui nettoie les poignées ouvertes), donc l'erreur ne se passait pas souvent).
Nous utilisons un proxy Apache avec le protocole AJP. Le problème était une mauvaise implémentation de protocole.
Notre configuration Connector est maintenant la suivante:

<Connector
        port="8009"
        protocol="org.apache.coyote.ajp.AjpNioProtocol"
        connectionTimeout="1800000"

        acceptorThreadCount="2"
        maxThreads="400"
        maxConnections="8192"
        asyncTimeout="20000"
        acceptCount="200"
        minSpareThreads="40"
        compression="on"
        compressableMimeType="text/html,text/xml,text/plain"

        enableLookups="false"
        URIEncoding="UTF-8"
        redirectPort="8443" />


0 commentaires