IOException: Trop de fichiers ouverts

Je suis en train de déboguer un descripteur de fichier de fuite dans une Java webapp cours d'exécution dans la Jetée 7.0.1 sur Linux.

L'application avait été heureux en cours d'exécution pour un mois ou lorsque la demande a commencé à échouer en raison de trop de fichiers ouverts, et de la Jetée a dû être redémarré.

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)

Au début, je pensais que le problème était avec le code qui lance le programme externe, mais c'est à l'aide de communes-exec et je ne vois rien de mal à cela:

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"));
    }
}

Liste des fichiers ouverts sur le serveur, je peut voir un grand nombre de mémoires 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

lors de la Jetée commence il y a juste 10 Fifo, après quelques jours, il ya des centaines d'entre eux.

Je sais que c'est un peu vague, à ce stade, mais avez-vous des suggestions sur où chercher la prochaine, ou comment obtenir des informations plus détaillées à propos de ces descripteurs de fichiers?

  • Voyons voir un peu de code
  • Ajouté le code de lancement le programme externe.
  • En tant que source supplémentaire de informaiton netstat-anp --tcp|grep <PID> --la couleur peut être
  • ajouter enfin le bloc après le try-catch et de fermer tous les volets. Il pourrait être possible que les flux ne sont pas fermer correctement et à cet effet, vous avez eu cette erreur. Notez également que linux traite les connexions ouvertes en compte dans les fichiers ouverts, afin de vérifier ur le code pour ouvrir la connexion.
  • Voir aussi stackoverflow.com/questions/4289447/java-too-many-open-files
InformationsquelleAutor Mirko N. | 2010-01-11