8 votes

Erreur JBoss Too Many Files Open

Au cours de la semaine dernière, j'ai eu des problèmes pour accéder à une application Web JBoss (v 4.2.2). Lorsque j'accède à la page d'accueil, j'obtiens une page d'erreur java.lang.NullPointerException. Après avoir consulté le journal de JBoss, il apparaît que trop de fichiers sont ouverts. Comment puis-je fermer ces fichiers ? Voici le résultat du journal JBoss :

  ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
    java.io.FileNotFoundException: /usr/local/jboss-4.2.2.GA/server/default/work/jboss.web/localhost/catissuecore/org/apache/jsp/pages/content/home/Error_jsp.java (Too many open files)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:152)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423)
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
    ERROR [[localhost]] Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/pages/content/home/Error.jsp]
    org.apache.jasper.JasperException: Unable to compile class for JSP
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:574)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:316)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423)
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:270)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.io.FileNotFoundException: /usr/local/jboss-4.2.2.GA/server/default/work/jboss.web/localhost/catissuecore/org/apache/jsp/pages/content/home/Error_jsp.java (Too many open files)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:152)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
    ... 21 more

14voto

fvu Points 21471

Tout d'abord, vous voulez déterminer quel(s) fichier(s) reste(nt) ouvert(s). Je suppose que votre serveur tourne sous linux, donc une fois que vous connaissez le PID de JBoss.

ps ax | grep something-that-makes-your-jboss-process-unique

vous pouvez faire

ls -l /proc/jbosspid/fd

pour obtenir une belle liste des fichiers ouverts à cet instant.

Ce que vous allez faire ensuite dépend un peu de ce que vous voyez ici :

  1. il vous suffit peut-être d'augmenter un peu le nombre de fichiers que le serveur peut ouvrir avec ulimit (vérifiez également les limites du système sur votre serveur).
  2. vous repérez peut-être un certain nombre de fichiers que votre application a oublié de fermer
  3. ....

Mais pour fermer ces fichiers / se débarrasser des fichiers ouverts, vous devrez redémarrer l'instance JBoss.

7voto

David Rabinowitz Points 14133

Si vous êtes sous Linux (ou autre *NIX), la limite des descripteurs de fichiers est de 1024 par processus. Sous Unix, tout est un fichier, y compris les sockets, les périphériques, etc. Une façon d'y jeter un coup d'oeil est de lancer la commande lsof (uniquement en tant que Root) - elle vous montrera tous les descripteurs de fichiers ouverts.

Pour corriger cela, modifiez le fichier /etc/security/limits.conf et ajoutez les lignes suivantes, puis redémarrez votre jboss.

jboss          soft    nofile          16384
jboss          hard    nofile          16384

(en supposant que votre jboss est exécuté par l'utilisateur "jboss")

3voto

user621684 Points 41

J'ai eu ce problème également (sous linux). Ce que j'ai fait :

  1. Vérifier les limites : ulimit -a

  2. vérifier 2 lignes dans la sortie :

    open files                      (-n) 1024
    max user processes              (-u) 1024
  3. Définissez les deux paramètres ( par exemple dans votre .bash_profile )

    ulimit -n 100000
    ulimit -u 100000

Dans mon cas, j'ai dû modifier les deux paramètres pour résoudre le problème.

0voto

mustaine Points 81

J'ai eu le même problème. L'astuce consiste à augmenter l'ulimit. J'ai trouvé une solution ici http://blog.air4android.com/2012/06/26/tomcatjboss-error-too-many-files-open-http-500/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X