Un problème si l'état Zombie n'est pas effacé?

18

J'ai une unité de production dans laquelle le processus java est devenu Zombie et y est resté pendant un certain temps maintenant. Si l'unité est redémarrée, elle sera effacée. Cependant, l'unité n'est pas redémarrée et un autre processus java est en cours d'exécution. Y a-t-il un problème si cet état de zombie reste tel qu'il est sans l'effacer? Cela affectera-t-il de quelque façon que ce soit (performances ou lenteur)?

Ravi
la source

Réponses:

22

Le processus Zombie n'aura aucun effet sur les performances ou la lenteur car les processus Zombie n'utilisent aucune ressource système.

Remarque: - Pratiquement, il utilise toujours le PID (qui est une ressource limitée), et les structures de données du noyau pour le processus sont toujours allouées. Habituellement, cela n'a pas beaucoup d'importance, mais l'utilisation de la mémoire du noyau peut être importante sur les systèmes avec une mémoire très limitée.

Problème causé par le processus zombie

Chaque processus zombie conserve son ID de processus. Les systèmes Linux ont un nombre fini d'ID de processus - 32767 par défaut sur les systèmes 32 bits.

Remarque : sur les systèmes 64 bits, vous pouvez augmenter le PID maximal, voir /unix//a/16884/170373

Cependant, quelques processus zombies ne posent aucun problème - bien qu'ils indiquent un bogue avec leur processus parent sur votre système.

Explication:

Lorsqu'un processus meurt sous Linux, il n'est pas tout supprimé de la mémoire immédiatement - son descripteur de processus reste en mémoire.

Le statut du processus devient EXIT_ZOMBIEet le parent du processus est informé que son processus enfant est mort avec le SIGCHLDsignal.

Le processus parent est ensuite censé exécuter l'appel système wait () pour lire l'état de sortie du processus mort et d'autres informations. Cela permet au processus parent d'obtenir des informations du processus mort. Après l'appel de wait (), le processus zombie est complètement supprimé de la mémoire.

Cela se produit normalement très rapidement, vous ne verrez donc pas de processus zombies s'accumuler sur votre système. Cependant, si un processus parent n'est pas programmé correctement et n'appelle jamais wait (), ses enfants zombies resteront en mémoire jusqu'à ce qu'ils soient nettoyés.

Résolution:

Vous ne pouvez pas tuer les processus zombies car vous pouvez tuer les processus normaux avec le signal SIGKILL - les processus zombies sont déjà morts.

Une façon de tuer un zombie est d'envoyer le signal SIGCHLD au processus parent. Ce signal indique au processus parent d'exécuter l'appel système wait () et de nettoyer ses enfants zombies. Envoyez le signal avec la commande kill, en remplaçant pid dans la commande ci-dessous par le PID du processus parent:

kill -s SIGCHLD pid

À la fin du processus qui a créé les zombies, init hérite des processus zombies et devient leur nouveau parent. (init est le premier processus démarré sur Linux au démarrage et se voit attribuer le PID 1.)

Remarque: - À partir de Linux 3.4, les processus peuvent émettre l'appel système prctl () avec l'option PR_SET_CHILD_SUBREAPER et, par conséquent, ce n'est pas le processus n ° 1 qui deviendra le parent de leurs processus descendants orphelins. Voir: /unix//a/177361/5132  

INIT exécute ensuite l'appel système wait () pour nettoyer ses enfants zombies, donc init fera un travail court sur les zombies. Vous pouvez redémarrer le processus parent après l'avoir fermé.

Arushix
la source
Y a-t-il une chance où wait () lui-même échoue?
Ravi
3
Sur les systèmes 64 bits, vous pouvez augmenter le PID maximum, voir unix.stackexchange.com/a/16884/170373
ilkkachu
1
La partie sur la réparation est également erronée. unix.stackexchange.com/a/177361/5132 Ironiquement, faire des sous-serveurs de programmes qui ne devraient pas l'être est un moyen facile de provoquer des processus zombies à long terme.
JdeBP
2
Le parent aura déjà reçu un SIGCHLD lorsque le processus qui est maintenant un zombie est mort.
Ángel
2
À strictement parler, il n'est pas correct de dire qu'il n'utilise aucune ressource. Il utilise toujours le PID (qui est une ressource limitée) et les structures de données du noyau pour le processus sont toujours allouées. Habituellement, cela n'a pas beaucoup d'importance, mais l'utilisation de la mémoire du noyau peut être importante sur les systèmes avec une mémoire très limitée.
Austin Hemmelgarn
6

Surtout, les zombies ne sont pas un gros problème. Il s'agit d'un processus «mort», qui ne prend pas de temps CPU, et toute mémoire allouée aurait dû être libérée par le processus avant de mourir. La seule ressource qu'ils prennent réellement est une entrée dans votre liste de processus. Selon votre système, vous pouvez avoir un nombre maximum autorisé de threads, et avoir des zombies peut vous faire atteindre cette limite plus rapidement sans raison.

Cependant: les zombies apparaissent généralement à cause d'un code incorrect / bogué, où le programmeur a oublié de vérifier les états de ses processus enfants. Cela peut être intentionnel, mais ce n'est souvent pas le cas. Un code incorrect / bogué gérera également la mémoire de manière spéciale et ne libérera pas certaines ressources allouées. Si tel est le cas, ces ressources resteront allouées au zombie, jusqu'à ce qu'il soit complètement terminé.

Edit : Si le processus est un programme java, la mémoire non libérée ne devrait pas être un problème, car le garbage collector java s'occupe de tout.

Vince
la source
3
En fait, la mémoire d'alimentation n'est pas un problème pour la plupart des systèmes d'exploitation dans toutes les langues. Le système libérera toute la mémoire sauf une petite quantité pour le processus parent.
val dit Réintégrer Monica le