2016-04-05 18 views
0

JavaとHibernate/SpringでPlay Framework 2.3.4を使用しています。 それは数日間生産で正常に動作し、その後、突然、この処理が行われますので、Play Framework呼び出しコントローラが原因でファイルが多すぎますエラー

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) 

:次に

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 

これらのいくつか:

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) 

そして、これらのいくつか基本的には、アプリケーションを再起動するまでは、すべてこのエラーが発生します。メモリリークのように思えるかもしれませんが、何かが適切に閉じられていないのですが、何ができるか分かりません。誰もこのエラーを以前に持っていましたか?ありがとう。

+0

'lsof | grep |あなたはplay proccessファイルで開いているすべてを見ることができます。 – MipH

答えて

1

Linuxを使用しているファイルパスから、開くことができるファイルとソケットの数に制限があります。通常は1024に設定されています。開いているファイルディスクリプタの数は、 lsofコマンドあなたが得ている問題は、限界を超えているということです。これを確認するにはlsof -u <playuser> | wc -lを実行してください。ユーザごとに現在設定されている制限は、/etc/security/limits.conf(少なくともUbuntuとRedHatの場合)で確認できます。

多くのファイルハンドラまたはソケットを開く正当な理由がある場合は、ulimitコマンドを使用して制限を増やすことができます(ulimit -nは、システムがサポートする最大数に制限を設定します)。しかし、もしあなたがいなくて、漏れがあれば、これは避けられないクラッシュを延期するだけです。

非常に多くのファイルハンドラとソケットを開く正当な理由がない場合は、作成したソケットを閉じていることを確認して、それらのすべてを閉じることを確認します。FileInputStreams 'finally'ブロックで正しく閉じていることを確認してください。あなたのコントローラコードを見ることなく、私はそれがFileInputStreamsを閉じることで問題であると確信することはできませんが、私はそれらをチェックすることをお勧めします。

同様の質問hereがあります。ソケットの制限についてもう少し詳しく説明します。

関連する問題