Я пытаюсь отлаживать утечку дескриптора файла в Java webapp, работающем в Jetty 7.0.1 на Linux.
Приложение было успешно запущено в течение месяца или около того, когда запросы начали сбой из-за слишком большого количества открытых файлов, и Jetty пришлось перезапустить.
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)
Сначала я думал, что проблема связана с кодом, запускающим внешнюю программу, но с использованием commons-exec, и я не вижу что-то не так:
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"));
}
}
Листинг открытых файлов на сервере я вижу большое количество FIFO:
# 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
когда начинается Jetty, всего 10 FIFO, через несколько дней их сотни.
Я знаю, что это немного неопределенно на данном этапе, но есть ли у вас какие-либо предложения о том, где искать дальше, или как получить более подробную информацию об этих дескрипторах файлов?