2016-04-05 7 views
0

Wir verwenden Play Framework 2.3.4 mit Java und Hibernate/Spring. Es läuft gut für ein paar Tage in der Produktion und dann plötzlich das geschieht:Play Framework Aufruf Controller verursacht zu viele offene Dateien Fehler

java.net.SocketException: Too many open files 
    at java.net.Socket.createImpl(Socket.java:460) 
    at java.net.Socket.getImpl(Socket.java:520) 
    at java.net.Socket.setTcpNoDelay(Socket.java:980) 
    at com.mysql.jdbc.StandardSocketFactory.configureSocket(StandardSocketFactory.java:134) 
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:205) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:297) 
    ... 75 more 

einige von ihnen dann:

java.io.FileNotFoundException: /opt/psldata-api-1.0.0/app/controllers/StatsController.java (Too many open files) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at play.utils.PlayIO$.readFileAsString(PlayIO.scala:63) 
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302) 
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302) 
    at scala.Option.map(Option.scala:145) 
    at play.api.Application$$anon$1.input(Application.scala:302) 
    at play.api.PlayException$ExceptionSource.interestingLines(PlayException.java:81) 
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:157) 
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:142) 
    at scala.Option.map(Option.scala:145) 
    at views.html.defaultpages.devError$.apply(devError.template.scala:142) 
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141) 
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141) 
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:147) 
    at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsAdapter$$super$onError(JavaGlobalSettingsAdapter.scala:36) 
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36) 
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36) 
    at scala.Option.getOrElse(Option.scala:120) 
    at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:36) 
    at play.api.Application$class.handleError(Application.scala:319) 
    at play.api.DefaultApplication.handleError(Application.scala:402) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) 
    at scala.Option.map(Option.scala:145) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:320) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:316) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) 
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) 
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) 
    at scala.concurrent.Promise$class.complete(Promise.scala:55) 
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 

Und dann einige davon:

java.io.FileNotFoundException: /opt/psldata-api-1.0.0/app/controllers/APIController.java (Too many open files) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at play.utils.PlayIO$.readFileAsString(PlayIO.scala:63) 
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302) 
    at play.api.Application$$anon$1$$anonfun$input$2.apply(Application.scala:302) 
    at scala.Option.map(Option.scala:145) 
    at play.api.Application$$anon$1.input(Application.scala:302) 
    at play.api.PlayException$ExceptionSource.interestingLines(PlayException.java:81) 
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:157) 
    at views.html.defaultpages.devError$$anonfun$apply$1.apply(devError.template.scala:142) 
    at scala.Option.map(Option.scala:145) 
    at views.html.defaultpages.devError$.apply(devError.template.scala:142) 
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141) 
    at play.api.GlobalSettings$$anonfun$devError$1$1.apply(GlobalSettings.scala:141) 
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:147) 
    at play.core.j.JavaGlobalSettingsAdapter.play$core$j$JavaGlobalSettingsAdapter$$super$onError(JavaGlobalSettingsAdapter.scala:36) 
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36) 
    at play.core.j.JavaGlobalSettingsAdapter$$anonfun$onError$2.apply(JavaGlobalSettingsAdapter.scala:36) 
    at scala.Option.getOrElse(Option.scala:120) 
    at play.core.j.JavaGlobalSettingsAdapter.onError(JavaGlobalSettingsAdapter.scala:36) 
    at play.api.Application$class.handleError(Application.scala:319) 
    at play.api.DefaultApplication.handleError(Application.scala:402) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) 
    at scala.Option.map(Option.scala:145) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:320) 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:316) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:46) 
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) 
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) 
    at scala.concurrent.Promise$class.complete(Promise.scala:55) 
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) 
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) 
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) 

So Im Grunde gibt alles weiter diesen Fehler, bis ich die Anwendung neu starte. Es scheint wie ein Speicherleck oder etwas ist nicht richtig geschlossen, aber ich habe keine Ahnung, was es sein könnte. Hat jemand diesen Fehler schon einmal gehabt? Vielen Dank.

+0

'lsof | grep | mehr 'und Sie werden alle von Play Prozessdateien geöffnet sehen. – MipH

Antwort

1

Ich kann von Ihren Dateipfaden aus sehen, dass Sie Linux verwenden, das die Anzahl der Dateien und Sockets begrenzt, die normalerweise auf 1024 gesetzt werden. Sie können die Anzahl der geöffneten Dateideskriptoren mit zählen der lsof Befehl. Das Problem, das Sie bekommen, ist, dass Sie das Limit überschreiten. Sie können lsof -u <playuser> | wc -l ausführen, um dies zu überprüfen. Sie können die Limits sehen, die Sie pro Benutzer in /etc/security/limits.conf (für mindestens Ubuntu und RedHat) eingerichtet haben.

Wenn Sie einen legitimen Grund haben, viele Dateihandler oder Sockets geöffnet zu haben, können Sie das Limit mit dem Befehl ulimit erhöhen (ulimit -n wird das Limit auf die maximale Anzahl setzen, die das System unterstützt). Aber wenn Sie es nicht tun, und Sie haben ein Leck, wird dies einfach den unvermeidlichen Absturz aufschieben.

Wenn es keinen legitimen Grund gibt, so viele Dateihandler und Sockets geöffnet zu haben, würde ich überprüfen, ob Sie alle von Ihnen erstellten Sockets schließen und sicherstellen, dass Sie alle diese FileInputStreams schließen. Stellen Sie sicher, dass Sie sie in "finally" Blöcken richtig schließen. Ohne Ihren Controller-Code zu sehen, kann ich nicht sicher sein, dass es ein Problem beim Schließen der FileInputStreams ist, aber ich empfehle, sie zu überprüfen.

Es gibt eine ähnliche Frage here mit ein bisschen mehr Details zu Socket-Grenzen.

Verwandte Themen