Я пытаюсь отлаживать утечку дескриптора файла в Java webapp, работающем в Jetty 7.0.1 на Linux.IOException: Слишком много открытых файлов
Приложение было счастливо запущено в течение месяца или около того, когда запросы начали сбой из-за слишком большого количества открытых файлов, и 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"));
}
}
Листинг открытых файлов на сервер можно увидеть большое количество 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
когда Jetty начинает есть только 10 FIFOs, через несколько дней есть сотни из них.
Я знаю, что на данном этапе это немного расплывчато, но есть ли у вас какие-либо предложения о том, где искать дальше, или как получить более подробную информацию об этих дескрипторах файлов?
Давайте посмотрим код –
Добавлен код запуска внешней программы. –
В качестве дополнительного источника informaiton netstat -anp --tcp | grep --color может быть –
zaletniy