2009-10-15 11 views
6

Proprio nell'ultima settimana ho avuto problemi con l'accesso a un'applicazione web JBoss (v 4.2.2). Quando vado alla pagina iniziale, ottengo una pagina di errore java.lang.NullPointerException. Dopo aver esaminato l'output del registro JBoss, sembra che siano aperti troppi file, quindi come farei per chiudere questi file? Ecco l'output del registro di JBoss:JBoss Too Many File Open Error

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 

risposta

11

Prima di tutto si vuole determinare quali file (s) rimarrà aperto. Sto supponendo che il server esegue Linux, quindi una volta che sai JBoss'es PID

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

si può fare

ls -l /proc/jbosspid/fd 

per ottenere una bella lista di file aperti in quel momento.

Cosa hai intenzione di fare dopo dipende un po 'su quello che si vede qui:

  1. si può solo bisogno di aumentare il numero di file server in grado di aprire un po' con ulimit (anche guardare systemwide limiti sul server)
  2. forse individuare un certo numero di file dell'applicazione dimenticato di chiudere
  3. ....

Ma per chiudere questi file/eliminare i file aperti dovrete riavvia il JBos s istanza.

+4

+1 per verificare eventuali perdite prima di aumentare ulimit. –

5

Supponendo di eseguire su linux (o altro * NIX), esiste un limite di descrittore di file di 1024 per processo. In Unix tutto è un file - incluso un socket, un dispositivo e così via. Un wat per dare un'occhiata a questo è eseguire il comando lsof (solo come root) - mostrerà tutti i descrittori di file aperti.

Per risolvere il problema, modificare il file in /etc/security/limits.conf e aggiungere le seguenti righe e riavviare il jboss.

jboss   soft nofile   16384 
jboss   hard nofile   16384 

(supponendo che il JBoss viene eseguito dall'utente "JBoss")

3

Ho avuto questo problema anche (su linux). Quello che ho fatto:

  1. Controlla i limiti: ulimit -a
  2. controllo 2 linee in uscita:
 
    open files      (-n) 1024 
    max user processes    (-u) 1024 
  1. Impostare entrambi i parametri (per esempio nel vostro .bash_profile)
 
    ulimit -n 100000 
    ulimit -u 100000 

Nel mio caso ho dovuto modificare entrambi i parametri per risolvere il problema.