Дескрипторы файлов моего java-процесса становятся «плохими», и я не знаю, почему

У меня есть веб-приложение java, созданное с помощью Lucene, и я продолжаю получать различные исключения" файл уже закрыт "- в зависимости от того, какую реализацию каталога я использую. мне удалось получить "java.io.IOException Bad File Descriptor" и "java.nio.channels.ClosedChannelException" из Lucene, обычно обернутые вокруг исключения AlreadyClosedException для IndexReader.

Забавно то, что я не t закрыл IndexReader, и кажется, что файловые дескрипторы устаревают сами по себе. Я использую последнюю версию Lucene 3.0 (не успел обновить серию 3.0), последнюю версию Oracle JDK6, последняя версия Tomcat 6 и последняя версия CentOS. Я могу воспроизвести ошибку с тем же программным обеспечением в других системах Linux, но не в системах Windows, и у меня нет ПК OSX для тестирования. Серверы Linux виртуализированы с помощью qEmu, если это вообще может иметь значение.

Похоже, это тоже связано с нагрузкой - как часто это происходит соответствует количеству запросов в секунду, которые обслуживает Tomcat (для этого конкретного веб-приложения). Например, на одном сервере каждый запрос завершается, как ожидалось, пока ему не придется иметь дело с ~ 2 запросами / сек, затем около 10% начинают закрывать свои файловые дескрипторы из-под них, в середине запроса (код проверяет действительный объект IndexReader и создает его в начале обработки запроса). Когда он достигает примерно 3 запросов в секунду, все запросы начинают завершаться ошибкой из-за плохих файловых дескрипторов.

Я предполагаю, что на уровне ОС происходит нехватка ресурсов и ОС очищает файловые системы ... но это просто потому что я устранил все идеи, которые у меня были. Я уже проверил ulimits и ограничения fd файловой системы, и количество открытых дескрипторов значительно ниже любого предела (пример вывода из sysctl fs.file-nr : 1020 0 203404, ulimit -n: 10240) .

Мне почти нечего было проверять, и я не ближе к решению этой проблемы, чем тот день, когда я об этом узнал. Кто-нибудь испытал что-нибудь подобное?

РЕДАКТИРОВАТЬ 07/12/2011: Я нашел машину OSX, которую можно использовать для некоторого тестирования, и подтвердил, что это происходит в OSX. Я также провел тестирование физических компьютеров с Linux и воспроизвел проблему, поэтому единственной ОС, с которой мне не удалось воспроизвести эту проблему, является Windows. Я предполагаю, что это как-то связано с обработкой файловых дескрипторов POSIX, потому что это, кажется, единственное существенное различие между двумя тестовыми системами (версия JDK, версия tomcat и веб-приложение были идентичны на всех платформах).

15
задан oorza 12 July 2011 в 20:14
поделиться