Я пытаюсь отладить утечку дескриптора файла в веб-приложении 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 после нескольких дней, там сотни из них.
Я знаю, что это немного неопределенно на данном этапе, но у Вас есть какие-либо предложения на том, где посмотреть затем, или как получить более подробную информацию о тех дескрипторах файлов?
Ваша внешняя программа ведет себя неправильно. Посмотрите, почему она этого не делает.
Как вы работаете на Linux, я подозреваю, что вы заканчиваетесь из файловых дескрипторов. Проверьте Ulimit. Вот статья, которая описывает проблему: http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-ofen-files/
не знают природы вашего приложения, но я видел эту ошибку, проявленную многократно из-за утечки пула соединения, так, чтобы стоило бы проверить. На Linux сокетные соединения используют файлы файловой системы, а также дескрипторы файлов. Просто мысль.