barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 22 мая 2012 г.

java.io.FileNotFoundException: (Too many open files)

Проблема:

Беспроблемно работающее ранее Java-приложение стало вдруг валиться с исключениями:
java.io.FileNotFoundException: (Too many open files)
При этом файл, на отсутствие которого программа ругается, на месте, и необходимые права на него есть.

Причина:

Срабатывают ограничения ОС на число открытых пользователем файлов, либо ограничения на число открытых процессом файлов. В Linux за это отвечает PAM, а точнее его модуль pam_limits. Текущие ограничения можно посмотреть с помощью:
ulimit -n
Посмотреть число файлов, открытых процессом можно так:
lsof -p <PID> | grep / | sort -k9 -u |wc -l
"lsof -p <PID>" выдаст все используемые указанным процессом дескрипторы файлов, включая файлы, отображаемые в память (memory-mapped files). Т.к. отображаемые в память файлы не подпадают под ограничения PAM-а, их нужно отфильтровать с помощью "grep /". Т.к. нас интересует не число дескрипторов, а число уникальных файлов, выполняем "sort -k9 -u". Эта команда отберет строки с уникальными значениями в 9ой колонке (именно в ней в выдаче lsof идет имя файла). Ну и "wc -l" выполнит подсчет полученных в итоге строк. Полученное значение будет на 1 больше, чем число файлов, т.к. в выборку, получаемую на выходе sort, попадет строка с заголовками колонок, выдаваемая lsof-ом. За методику подсчета спасибо https://serverfault.com/questions/396872/why-or-how-does-the-number-of-open-file-descriptors-in-use-by-root-exceed-ulim.

Для пользователя аналогичная операция делается так:
lsof -u <username> | grep / | sort -k9 -u |wc -l
Как изменить ограничение на число открытых файлов в Linux, я уже писал тут: http://barbitoff.blogspot.com/2012/05/pam-limits-root.html. В Windows, вероятно, есть аналогичное решение этой проблемы.

Комментариев нет:

Отправить комментарий