Différents scripts Perl (côté serveur comprend) appelez un module PERL avec de nombreuses fonctions sur un site Web.
Edit: strong>
Les scripts utilisent Le serveur répertorie: p> J'ai des centaines d'instances de chacun. P > EDIT: strong>
Nous n'utilisons pas la fourchette, le système ou l'EXEC, séparer la directive SSI P> <!--#exec cgi="/cgi-bin/scriptname.pl"-->
3 Réponses :
Plus d'aide au bandage que la meilleure pratique, mais parfois, vous pouvez vous éloigner avec simple selon le Documentation Perlipc P> sur la plupart des plates-formes Unix, le Si vous vous souciez des statuts de sortie des processus enfants, vous devez les recueillir (communément appelé «récolte») en appelant Si vos programmes Perl eux-mêmes sont les processus d'enfant devenant des zombies, cela signifie que leur < / EM> Les parents (ceux qui forcent - et oublient votre code) doivent être nettoyés après eux-mêmes. Un processus ne peut pas s'arrêter de devenir un zombie. P> p>
chld code> (parfois également appelé
CLD code>) signal comporte un comportement spécial par rapport à une valeur de
'Ignorer' code >. Réglage
$ SIG {CHLD} code> à
'Ignorer' code> sur une telle plate-forme a pour effet de ne pas créer de processus de zombie lorsque le processus parent ne parvient pas à
attendre () code> sur ses processus enfants ( IE em>, les processus enfants sont automatiquement récoltés). Appelant
attendre () code> avec
$ SIG {CHLD} code> défini sur
'Ignorer' code> renvoie généralement -1 sur ces plates-formes. P>
blockquote>
attendre code>
ou WaiterPID code> . Malgré le nom effrayant, un zombie n'est qu'un processus d'enfant qui a disparu mais dont le statut n'a pas encore été récolté. P>
Merci beaucoup G. Je ne dis pas que je comprends comment ça marche mais je vais en savoir plus à ce sujet. Je suppose que CHLD va dans le script appelant. Est-ce correct?
Waiterpid (-1, Wnohang) ne bloquera pas, il peut donc être appelé périodiquement pour collecter le statut de sortie des enfants. Utilisez une boucle comme celle-ci pour récolter tous vos zombies: tandis que (($ pid = waiterpid (-1, wnohang))> 0) ...
@G Berdal Comment vos scripts sont-ils démarrés? Contrôlez-vous ce code?
@gbacon, ils sont côté serveur incluent des pages d'un site Web. La plupart d'entre eux appelle une bibliothèque pour des fonctions. La chose amusante est que les scripts SSI sont ceux qui deviennent des zombies en fonction des journaux.
Quel serveur Web utilisez-vous? (J'assume Apache, que je m'attendrais à récolter les statuts de sortie des enfants correctement!) Veuillez fournir des échantillons représentatifs des messages du journal que vous voyez correspondant à des zombies. Vous voudrez peut-être modifier votre question avec pour inclure ces informations. Les messages du journal seront beaucoup plus lisibles que dans un commentaire.
Vous avez écrit que cela se produit sous une charge importante. Lorsque le trafic est soulevé, Apache récolte enfin les zombies ou traînent-ils jusqu'à ce que vous redémarrez Apache? Si le premier, la machine pourrait être trop occupée de servir des demandes de se déplacer. Ce dernier est probablement un bogue quelque part de votre contrôle. Quoi qu'il en soit, les gentils responsables de la faute du serveur seront probablement plus utiles pour vous, et nous pourrions déplacer votre question si vous le souhaitez.
+1 C'est une très bonne question. Je demanderai à l'administrateur de vérifier cela pour moi. Je pense que c'est un peu prématuré de dire que c'est uniquement un problème de serveur. Je souhaite que c'était, alors je pourrais simplement le transmettre à l'administrateur. :)
Comme vous avez tous les bits vous-même, je vous suggérerais d'exécuter les scripts individuels une à la fois de la ligne de commande pour voir si vous pouvez repérer ceux qui sont suspendus. P>
Une liste PS affiche-t-elle un nombre démesuré d'instances d'un script particulier en cours d'exécution? P>
Exécutez-vous les CGI en utilisant mod_perl? p>
sont-ils dépendants d'un autre serveur ou service? p>
J'ai repéré ceux qui sont suspendus. Presque tous les SSI sur la page Web deviennent plusieurs instances de zombies. Ils appellent une bibliothèque pour des fonctions. Ce que je ne suis pas sûr de savoir qui compte comme un parent pour ceux-ci?
Le processus qui appelé SSI ou CGI est son parent. Vous pouvez essayer d'utiliser PS code> pour rechercher l'ID de processus PPID (ID de processus parent), puis voir ce que ce processus est, mais je ne suis pas positif désactivé si
ps code> retournera un PPID pour les zombies. (On dirait que cela devrait, puisque le zombie doit savoir qui est censé le récolter, je n'ai tout simplement pas vérifié que cela fonctionne.) Pour moi, la sortie de
PS -L code> comprend PPID; Vérifiez la page de votre homme local si votre
PS code> se comporte différemment.
@Dave, lorsqu'un processus est un zombie, il n'a pas de ppid par définition.
@Dave, mon mauvais. Un processus orphelin n'a pas de PPID par définition. Un processus de zombie a disparu mais n'a pas encore été récolté.
Je viens de voir votre commentaire que vous exécutez Apache 1.3 et que vous pourriez être associé à votre problème.
SSI peut exécuter CGI. Mais les scripts CGI générant des SSI n'auront pas la traitée de ces SSI. L'évaluation des SSI arrive avant la course de CGI dans le cycle de requête Apache 1.3. Ceci a été corrigé avec Apache 2.0 et ultérieurement afin que CGI puisse générer des commandes SSI. P>
Comme je l'ai suggéré ci-dessus, essayez d'exécuter vos scripts seuls et jetez un coup d'œil à la sortie. Généralisent-ils des SSI? P>
alors si cela Les travaux ajoutent une directive SSI triviale telle que p> et voir ce qui se passe. p> Forcez-vous des processus de votre script Perl? Si tel est le cas, avez-vous ajouté un appel attente () sur le parent? P> Avez-vous également une sortie correcte dans le script? P> CORE::exit(0);
J'ai couru tous les scripts à travers le débogueur et éliminé toutes les erreurs et avertissements. Ils génèrent une sortie correctement. Nous étions sur le point de passer à 2,0 de toute façon. Pensez-vous que cela aiderait?
D'accord. Bon travail avec le débogueur pour éliminer toutes les erreurs et les avertissements. Est-ce que l'un de vos PERL CGIS fonctionne avec succès à l'achèvement?
Comme je l'ai dit, ils fonctionnent bien. Outre le fait qu'ils deviennent des zombies, ils fonctionnent parfaitement.
@George, ils ne fonctionnent pas bien si vous obtenez des processus zombies. Ces processus seront suspendus et consommeront lentement les ressources de votre serveur.
@Rob, pourrait utiliser POSIX: _exit (0); aider? Selon perdoc.perl.org/functions/exit.html qui évite les routines finales et Traitement destruction. Je pense que Gbacon pourrait avoir raison et le serveur n'a tout simplement pas le temps de faire une collection à la poubelle pendant les périodes occupées ...
Vous devez lancer une bombe de pipe
Le pistolet à double baril fonctionne bien aussi.
Ne les laissez pas manger votre cerveau aussi.
Hébergez-vous le site Web et vos Perl CGI sont fessées? Ou accueillez-vous des scripts qui chalinent un site Web tiers et surchargent-t-il le site?
J'ai essayé de le résoudre de violence, mais ils continuent à venir. - Je suppose que je vais avoir besoin de quelque chose de plus intelligent que ça. :)
Buvez d'abord quelques quantums Nuka-Cola. Oups, désolé, mauvais jeu ...
Rob, le client héberge les deux. Je devais déterminer pourquoi le serveur est surchargé quand j'ai trouvé la vie morte. Pourquoi?
@yx si c'est grand et court après avoir écrasé des voitures, j'utiliserais un molotov xd
Les flèches d'eau saintes aident à toutes sortes d'infestations mortes; Louez le constructeur!