Я пытаюсь отладить утечку файлового дескриптора в веб-приложении Java, работающем в 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
когда начинается Причал, остается всего 10 FIFO, а через несколько дней их сотни.
Я знаю, что на данном этапе это немного расплывчато, но есть ли у вас какие-либо предложения о том, где искать дальше или как получить более подробную информацию об этих файловых дескрипторах?