Моя программа Java терпит неудачу с
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:
root soft nofile 500000
root hard nofile 500000
* soft nofile 500000
* hard nofile 500000
Я запустил lsof
для подсчета количества открытых файлов - как глобально, так и процесса jvm. Я просмотрел счетчики в /proc/sys/fs
. Все кажется ОК. Мой процесс содержит только 4301 файлов, а предел 500 тыс.:
:~# 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. Я даже перезагрузился, поэтому я уверен, что эти параметры используются.
Я не знаю, соответствует ли это, но процесс запускается выскочкой script, которая запускает процесс с помощью setuidgid, например:
exec setuidgid username java $JAVA_OPTS -jar myprogram.jar
Что мне не хватает?