2016-04-26 9 views
3

Amazon LinuxのApache TomcatでWebサービスを実行しています。最初はWebサービスが正しく動作しています。 1000件以上のWebリクエストを行った後で、開いているファイルが多すぎます。この問題はTomcatサーバーを再起動すると解決されます。我々は、Webサービスに任意のファイル関連の操作を行っていない。Apache Tomcat Exception - 開いているファイルが多すぎます

例外

25-Apr-2016 10:05:52.628 SEVERE [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed 
java.io.IOException: Too many open files 
     at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) 
     at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) 
     at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:686) 
     at java.lang.Thread.run(Thread.java:745) 

PSの下に見つけてください。

+0

あなたはtomcatのあまりにも多くの開いているファイルをGoogleで検索しましたか? –

+0

あなたはどのOSを使用していますか? –

+0

amazon Linuxを使用しています –

答えて

6

オープンファイルにはいくつかの制限があるようです。あなたはLinuxで動作しているので、私はあなたがファイル記述子を使い果たしていると思われます。

ulimitコマンドをチェックすると、開いているファイルの数を確認できます。

ulimit -n 

あなたは編集で開いているファイルの数を変更することができます:あなたはlimits.confをhereについての詳細を確認することができます

* soft nofile 4096 
* hard nofile 4096 

/etc/security/limits.conf 

と、このようなものを追加します。

デフォルトの制限は1024で、一部のJavaアプリケーションでは低すぎる可能性があります。この記事では、開いているファイルの最大数を増やすことについて

詳細情報:http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/

2

これは、ソケット接続がファイルとして扱われるためです。つまり、あまりにも多くの接続が開かれているためです。制限事項を確認してください(それぞれのOSには異なるポリシーがあります - 各サーバに同じポリシーが適用されます)、同時に開くことができるポート数などNIOを使用して制限することができます。

1

「のulimitが」ある時点でダウン上げるとラインTomcatは同じエラーを引き起こして停止しますが。

これを避けるには、Linux上のアプリケーションユーザのオープンファイルのリストを "lsof -u username"コマンドまたは単に "lsof"コマンドでチェックし、コード関連ファイルが開いているかどうかを確認することができます)もしそうなら、特定のTomcatユーザに対して#kill -9 lsof -t -u usernameコマンドを使って特定のファイルを強制終了します。

あなたのクラスの静的ブロックに書くだけで、それらのファイルを読み込むようにコードを修正する必要があります。任意の数のユーザーによって複数のヒットが行われても、1つのファイルのみが読み込まれるようにします。

新しい変更を同じlsofコマンドでデプロイした後で確認できます。 1つのファイルのみが表示されます。これは毎回ulimitを上げることなくあなたの問題を永久に解決します

関連する問題