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_ZOMBIE
et le parent du processus est informé que son processus enfant est mort avec le SIGCHLD
signal.
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é.
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.
la source