2012-01-25 17 views
16

私のJavaプログラムがここ開いているファイルが多すぎますエラーが、lsofのは

Caused by: java.io.IOException: Too many open files 
     at java.io.UnixFileSystem.createFileExclusively(Native Method) 
     at java.io.File.createNewFile(File.java:883)... 

で失敗している開いているファイルの法的数を示し/etc/security/limits.confからの重要な線です。彼らは、500Kでのユーザーの最大のファイルを設定します。私は開くファイルの数をカウントするためにlsofを走った

root      soft nofile   500000 
root      hard nofile   500000 
*      soft nofile   500000 
*      hard nofile   500000 

- 両方のグローバルとJVMプロセスによって。私は/proc/sys/fsのカウンターを調べました。すべてはOKのようです。私のプロセスは4301個のファイルしか開かず、制限は500kです:

:~# lsof | wc -l 
5526 
:~# lsof -uusername | wc -l 
4301 
:~# cat /proc/sys/fs/file-max 
744363 
:~# cat /proc/sys/fs/file-max 
744363 
:~# cat /proc/sys/fs/file-nr 
4736 0  744363 

これはUbuntu 11.04サーバーです。私は再起動しているので、これらのパラメータが使用されていることを肯定的です。

私はこのように、setuidgidを使用してプロセスを開始する、それが関連するかどうかわからないが、プロセスは成り上がりスクリプトによって開始されます。

exec setuidgid username java $JAVA_OPTS -jar myprogram.jar 

私が行方不明ですか?

+0

ヒープスペースを更新して、それより大きな最大サイズを与えてください。なぜ二つが関連するのかはっきりしないが、私は無数の異なる問題のためにそのエラーにぶつかった。 – Relic

+0

面白い、ありがとう。しかしそれはすでに-Xmx5800mです。 – hughw

+0

いくつかのプロセスツリーでulimitを使って新しい制限を設定していますか? – Jayan

答えて

16

これは、問題は私のプログラムは、成り上がりのinitスクリプトとして実行されていたこと、そしてexecスタンザにはないということでしたが判明シェルを起動します。 ulimitとlimits.confの設定は、シェル内のユーザープロセスにのみ適用されます。

私は、ユーザー名のデフォルトのシェルでJavaを実行します

exec sudo -u username java $JAVA_OPTS -jar program.jar 

にexecのスタンザを変更することで、これを確認しました。これにより、プログラムは必要な数のオープンファイルを使用することができました。

I have seen it mentionedまた、コマンドを呼び出す前にulimit -nを呼び出すこともできます。起動スクリプトの場合は、代わりにscriptスタンザを使用すると思います。

開かれたファイル記述子の正確な数を得るために、lsofよりも良い診断がls /proc/{pid}/fd | wc -lであることがわかりました。私が4096のopen fdsで失敗が起こったことを私が見ることができることを監視することによって。 4096がどこから来るのか分かりません。どこにでも/ etcにはありません。私はそれがカーネルにコンパイルされていると思います。

4

は、私は、サーバーの作成スクリプトの先頭にはbashのこのスニペットを持っている:

# Jack up the max number of open file descriptors at the kernel 
echo "fs.file-max = 1000000" >> /etc/sysctl.conf 
invoke-rc.d procps start 

# Increase max open file descriptors for this process 
ulimit -n 1000000 

# And for future ones as well 
cat >> /etc/profile <<LIMITS 
ulimit -n 1000000 
LIMITS 
cat >> /etc/security/limits.conf <<LIMITS 
root - nofile 1000000 
LIMITS 
関連する問題