IOException: Zbyt wiele otwartych plików
Próbuję debugować wyciek deskryptora pliku w aplikacji WWW Java uruchomionej w systemie Jetty 7.0.1 w systemie Linux.
Aplikacja działała szczęśliwie przez około miesiąc, gdy żądania zaczęły zawodzić z powoduzbyt wiele otwartych plikówi Jetty trzeba było ponownie uruchomić.
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)
Na początku myślałem, że problem dotyczy kodu, który uruchamia zewnętrzny program, ale używacommons-exec i nie widzę w tym nic złego:
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"));
}
}
Wyświetlanie otwartych plików na serwerze Widzę dużą liczbę 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
kiedy zaczyna się Jetty, jest tylko 10 FIFO, po kilku dniach są ich setki.
Wiem, że na tym etapie jest to trochę niejasne, ale czy masz jakieś sugestie, gdzie szukać dalej, lub jak uzyskać bardziej szczegółowe informacje na temat tych deskryptorów plików?