2017-05-20 3 views
1

J'ai hérité d'un script Perl qui, en fonction de la configuration de la machine, échoue pendant les appels à fork avec $? == 11.La fourchette échoue avec "ressource temporairement indisponible". Quelle ressource?

Selon errno.h et variousposts, 11 est EAGAIN, à savoir « essayer à nouveau », car une ressource était temporairement indisponible.

Y at-il un moyen de déterminer quelle ressource a causé la fourche à l'échec, autre que de plus en plus diverses limites du système un par un (open file descriptors, swap space ou nombre de allowable threads)?

+0

Un processus fourchu est un clone complet du processus d'origine. Le profil de votre processus avant la fourche vous donnera une idée de la quantité de chaque ressource qu'il utilise. – alvits

+0

Voulez-vous dire $! = 11? – ikegami

+0

'Voulez-vous dire $! = 11?'. En fait, je me suis mal exprimé. Ce que j'aurais dû dire, c'est que la fourche est réussie, mais se termine immédiatement avec le code d'état 11, comme indiqué par 'wait'. – phonybone

Répondre

2

En supposant que vous voulez dire $! est EAGAIN, la page de manuel fork sur mon système dit:

EAGAIN: fork() ne peut pas allouer suffisamment de mémoire pour copier les tables de pages du parent et allouer une structure de tâche pour l'enfant. EAGAIN: Il n'a pas été possible de créer un nouveau processus car la limite de ressource RLIMIT_NPROC de l'appelant a été rencontrée. Pour dépasser cette limite, le processus doit avoir la capacité CAP_SYS_ADMIN ou CAP_SYS_RESOURCE.

Essayez-vous de créer une tonne de processus? Êtes-vous moissonner vos enfants quand ils ont fini?

+0

Voir mon commentaire ci-dessus pour une clarification de la question initiale, ce qui était une simplification excessive de ma part. La séquence réelle des événements est la suivante: après l'initialisation, le programme pré-traite un gros fichier (8Gb) au moyen de certains appels à system(). Programmez ensuite un processus pour chaque cpu core sur la machine. Ainsi, le programme essaie peut-être de dupliquer un très grand espace de mémoire quand il forge (mais Linux est en copie-écriture, donc ça devrait aller?). Il y a une grande quantité de RAM (184 Go), et j'ai augmenté le nombre de fichiers ouverts autorisés et augmenté l'espace de swap. – phonybone

+0

Certaines des fourchettes réussissent et d'autres échouent, et si je limite le nombre de fourches globales, alors je peux souvent faire fonctionner le programme normalement. – phonybone

+0

Re "* la fourche est réussie *", & "* Certaines des fourchettes réussissent et d'autres échouent *", Lequel est-ce? Quel appel appel est failiing? Pourquoi ne vérifiez-vous pas à quelle erreur il échoue? – ikegami