Erreur dans tomcat "trop de fichiers ouverts"
J'ai une application sur tomcat et parfois, j'ai l'erreur ci-dessous:
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:722)
....
SEVERE: Error processed default web.xml named conf/web.xml at /local/myApp/apache-tomcat/conf/web.xml
java.io.FileNotFoundException: /local/myApp/apache-tomcat/conf/web.xml (Too many open files)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.apache.catalina.startup.ContextConfig.getWebXmlSource(ContextConfig.java:1838)
at org.apache.catalina.startup.ContextConfig.getGlobalWebXmlSource(ContextConfig.java:1745)
at org.apache.catalina.startup.ContextConfig.getDefaultWebXmlFragment(ContextConfig.java:1418)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1253)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3926)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Thread.java:722)
- Je vérifier les limites de l'open de fichiers et c'est 1024 mais lorsque je vérifie le nombre de fichiers ouverts de l'application avec lsof c'est près de 200, pourquoi est-ce arrivé si elle n'atteint pas la limite?
Dois-je augmenter la limite? Est-il une autre raison pour obtenir cette erreur?
La seule façon d'obtenir le service fonctionne correctement à nouveau, c'est le redémarrage de tomcat, est-il une autre façon de revenir à la normale?
Merci d'avance.
MODIFIER:
Voici la servlet qui traitent de la méthode doPost, au début je n'ai pas fermé tous les cours d'eau, pourrait-il être? J'ai ajouté l'instruction enfin pour ce faire:
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
String paramName = "";
try {
os = response.getOutputStream();
is = request.getInputStream();
dis = new DataInputStream(is);
dos = new DataOutputStream(os);
.....
}catch (Throwable e) {
LOGGER.error(e.getMessage());
} finally {
if (dis != null) {
dis.close();
}
else if(is != null) {
is.close();
}
if (dos != null) {
dos.close();
}
else if( os != null) {
os.close();
}
}
EDIT2:
Après avoir fait quelques tests je me rends compte que si je ferme la première DataInputStream et puis l'InputStream, je reçois dans l'autre partie de la communication d'un certain nombre avant que le message(je ne sais pas pourquoi). J'ai changé l'ordre de fermeture du flux et il semble que tout est ok. Mais j'ai toujours le problème. Une idée?
finally {
if(is != null) {
try {
is.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if(os != null) {
try {
os.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
}
source d'informationauteur alicia | 2013-10-28
Vous devez vous connecter pour publier un commentaire.
Effectuez les opérations suivantes pour obtenir le pid, dire 1234, de tomcat7
et puis ne
cat /proc/1234/limits
de lire une ligne comme la suivanteMax open files 16384 16384 files
Ce sont le nombre maximal de fichiers ouverts qui sont autorisés par Tomcat. Pour l'augmenter, suivez les instructions ci-dessous
Trop de fichiers ouverts Tomcat.
Il peut être utile de savoir que vous pouvez modifier la limite de fichiers ouverts par adjonction, à
/etc/security/limits.conf
:Ensuite, vous pouvez recharger la configuration à l'aide de
sysctl -p
sur la coque. Vérifier cet article.Juste pour être complet, vous pouvez vérifier quelle est la limite actuelle pour les fichiers ouverts à l'aide de:
ulimit -n
La réponse @gaboroncancio posté est fondamentalement correct, mais ses conseils sur comment faire pour que les paramètres prennent effet n'est pas tout à fait droit.
sysctl -p
recharger/etc/sysctl.conf
ou quel que soit le fichier que vous transmettez en tant qu'argument. Cependant, lasysctl
commande ne reconnaît pas le format de/etc/security/limits.conf
.Pour recharger
/etc/security/limits.conf
vous avez juste besoin de se déconnecter et de se reconnecter.Cela permet d'afficher tous les fichiers ouverts de ce processus.
Cela permettra de montrer le nombre de fichiers ouverts.
Pour augmenter les fichiers ouverts limite de mise à jour
/etc/Secirity/limits.conf
.Pour vérifier pas d'ouvrir des fichiers spécifiques à tomcat:
Limite dure :
su - tomcat -c 'ulimit -Hn' -s '/bin/bash'
Limite douce :
su - tomcat -c 'ulimit -Sn' -s '/bin/bash'
Vous pouvez exécuter le script ci-dessous avec un maïs d'emploi pour connaître les détails des fichiers ouverts.
Si ce code est net d'exploitation (sockets), je ne suis pas sûr de Java XxxxxStrem a 1:1 rapport à l'OS limites de fichier (ou de relation). Peut-être besoin d'un peu de recherche, message d'exception a un mauvais texte? Très souvent dans le logiciel.
Mon intuition dire, nous ne comprenons pas Exception 2, rien dans le code (ou de la configuration absente en question) a la relation.
L'extension de fichiers du système d'exploitation limite lorsque le logiciel d'erreur (fuite) est le principal problème est une mauvaise politique, comme Vous l'avez bien comprendre