IOException: Слишком много открытых файлов

Я пытаюсь отладить утечку дескриптора файла в веб-приложении Java, работающем в Причале 7.0.1 на Linux.

Приложение счастливо работало в течение приблизительно одного месяца, когда запросы начали перестать работать из-за слишком многих открытых файлов, и Причал должен был быть перезапущен.

java.io.IOException: Cannot run program [external program]: java.io.IOException: error=24, Too many open files
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:459)
    at java.lang.Runtime.exec(Runtime.java:593)
    at org.apache.commons.exec.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:58)
    at org.apache.commons.exec.DefaultExecutor.launch(DefaultExecutor.java:246)

Сначала я думал, что проблема была с кодом, который запускает внешнюю программу, но это использует должностное лицо свободного городского населения, и я не вижу ничто плохого с ним:

CommandLine command = new CommandLine("/path/to/command")
    .addArgument("...");
ByteArrayOutputStream errorBuffer = new ByteArrayOutputStream();
Executor executor = new DefaultExecutor();
executor.setWatchdog(new ExecuteWatchdog(PROCESS_TIMEOUT));
executor.setStreamHandler(new PumpStreamHandler(null, errorBuffer));
try {
    executor.execute(command);
} catch (ExecuteException executeException) {
    if (executeException.getExitValue() == EXIT_CODE_TIMEOUT) {
        throw new MyCommandException("timeout");
    } else {
        throw new MyCommandException(errorBuffer.toString("UTF-8"));
    }
}

Список открытых файлов на сервере I видит высокое количество FIFOs:

# lsof -u jetty
...
java    524 jetty  218w  FIFO        0,6      0t0 19404236 pipe
java    524 jetty  219r  FIFO        0,6      0t0 19404008 pipe
java    524 jetty  220r  FIFO        0,6      0t0 19404237 pipe
java    524 jetty  222r  FIFO        0,6      0t0 19404238 pipe

когда Причал запускается существует всего 10 FIFOs после нескольких дней, там сотни из них.

Я знаю, что это немного неопределенно на данном этапе, но у Вас есть какие-либо предложения на том, где посмотреть затем, или как получить более подробную информацию о тех дескрипторах файлов?

26
задан Mirko N. 11 January 2010 в 20:38
поделиться

3 ответа

Ваша внешняя программа ведет себя неправильно. Посмотрите, почему она этого не делает.

7
ответ дан 28 November 2019 в 07:04
поделиться

Как вы работаете на Linux, я подозреваю, что вы заканчиваетесь из файловых дескрипторов. Проверьте Ulimit. Вот статья, которая описывает проблему: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-ofen-files/

8
ответ дан 28 November 2019 в 07:04
поделиться

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

5
ответ дан 28 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: