java.io.IOException: erreur=11
Je suis confronté à un problème bizarre avec le Java ProcessBuilder
. Le code est ci-dessous (dans une forme légèrement simplifiée)
public class Whatever implements Runnable
{
public void run(){
//someIdentifier is a randomly generated string
String in = someIdentifier + "input.txt";
String out = someIdentifier + "output.txt";
ProcessBuilder builder = new ProcessBuilder("./whateveer.sh", in, out);
try {
Process process = builder.start();
process.waitFor();
} catch (IOException e) {
log.error("Could not launch process. Command: " + builder.command(), e);
} catch (InterruptedException ex) {
log.error(ex);
}
}
}
whatever.sh lit:
R --slave --args $1 $2 <whatever1.R >> r.log
Charge des cas de Whatever
sont soumis à un ExecutorService
de taille fixe (35). Le reste de l'application attend tous à la finition - mis en œuvre avec un CountdownLatch
. Tout se passe bien pendant plusieurs heures (Scientific Linux 5.0, java version "1.6.0_24") avant de jeter l'exception suivante:
java.io.IOException: Cannot run program "./whatever.sh": java.io.IOException: error=11, Resource temporarily unavailable
at java.lang.ProcessBuilder.start(Unknown Source)
... rest of stack trace omitted...
Quelqu'un a une idée de ce que cela signifie? Basé sur le google/bing résultats de la recherche pour java.io.IOException: error=11
, il n'est pas le plus commun des exceptions et je suis complètement dérouté.
Mon sauvage et pas si une hypothèse est que j'ai trop de threads essayer de lancer le même fichier en même temps. Cependant, il faut des heures de temps CPU pour reproduire le problème, donc je n'ai pas essayé avec un plus petit nombre.
Toutes les suggestions sont grandement appréciés.
- avez-vous vérifié le fichier ouvert cound de votre processus java avec
lsof
? - Est-il errno 11 ou 12, ou les deux?
- erreur = 11
Vous devez vous connecter pour publier un commentaire.
La
error=11
est presque certainement leEAGAIN
code d'erreur:La
clone(2)
appel système documentsEAGAIN
de retour d'erreur:La
fork(2)
appel système des documents deuxEAGAIN
erreur retourne:Si vous étiez vraiment que peu de mémoire, il serait presque certainement montrer dans les journaux système. Vérifier
dmesg(1)
de sortie ou/var/log/syslog
pour tous les messages à propos de la faible mémoire vive du système. (D'autres choses allait se briser. Cela ne semble pas trop plausible.)Beaucoup plus probable est en cours d'exécution dans la limite de l'utilisateur sur les processus ou à l'échelle du système nombre maximum de processus. Peut-être l'un de vos processus n'est pas correctement reapting zombies? Ce serait très facile à repérer en cochant
ps(1)
production au fil du temps:(Peut-être vérifier toutes les minutes ou dix minutes, si il ne veut vraiment prendre des heures avant que vous êtes en difficulté.)
Si vous n'êtes pas à récolter les zombies, puis de lire tout ce que vous devez faire pour ProcessBuilder à utiliser
waitpid(2)
pour récolter vos enfants morts.Si vous êtes légitimement en cours d'exécution de plus de processus que votre rlimits permettre, vous aurez besoin d'utiliser
ulimit
dans votrebash(1)
scripts (si en cours d'exécution commeroot
) ou de l'ensemble des limites plus élevées dans/etc/security/limits.conf
pour lanproc
propriété.Si vous êtes plutôt en cours d'exécution dans le système de processus à l'échelle des limites, vous pourriez avoir besoin d'écrire une valeur plus grande dans
/proc/sys/kernel/pid_max
. Voirproc(5)
pour certains (court) détails.builder.start()
appeler précisément qui est en faute, mais juste le bout de code que la liquidation de signaler le problème? Bon de débogage. 🙂builder.start()
qui a échoué, mais il a échoué à cause d'une autre partie de l'application a déjà épuisé les ressources disponibles. Comme vous l'avez mentionné dans votre post, déboursant un processus requiert une certaine quantité de mémoire etc. Merci pour votre aideerrno 11 Ressource temporairement non disponible" C'est généralement un problème de mémoire et peut empêcher un fil ou une prise en cours de création.
errno 12 signifie "ne Peut pas allouer de la mémoire". C'est un échec pour obtenir le mémoire est un appel direct à la mémoire (plutôt qu'une ressource qui à son tour a besoin de la mémoire)
Je voudrais essayer d'augmenter l'espace d'échange de votre système qui devrait permettre d'éviter ce problème.