¿Algún problema si el estado del zombi no se borra?

18

Tengo una unidad de producción en la que el proceso de Java se convirtió en Zombie y permaneció allí durante algún tiempo. Si se reinicia la unidad, se borrará. Sin embargo, la unidad no se reinicia y otro proceso de Java está en funcionamiento. ¿Hay algún problema si este estado zombie permanece como está sin borrarlo? ¿Afectará de alguna manera (rendimiento o lentitud)?

Ravi
fuente

Respuestas:

22

El proceso de Zombie no tendrá ningún efecto en el rendimiento o la lentitud, ya que los procesos de Zombie no usan ningún recurso del sistema.

Nota: - Prácticamente, todavía está usando el PID (que es un recurso limitado), y las estructuras de datos del núcleo para el proceso todavía están asignadas. Por lo general, esto no importará mucho, pero el uso de la memoria del núcleo puede ser significativo en sistemas con memoria muy limitada.

Problema causado por el proceso zombie

Cada proceso zombie conserva su ID de proceso. Los sistemas Linux tienen un número finito de ID de proceso: 32767 de forma predeterminada en los sistemas de 32 bits. Si los zombies se acumulan a una velocidad muy rápida, el conjunto completo de PID disponibles eventualmente se asignará a procesos zombies, evitando que se inicien otros procesos.

Nota : en los sistemas de 64 bits, puede aumentar el PID máximo; consulte /unix//a/16884/170373

Sin embargo, algunos procesos de zombies dando vueltas no son un problema, aunque sí indican un error con su proceso principal en su sistema.

Explicación:

Cuando un proceso muere en Linux, no todo se elimina de la memoria inmediatamente, su descriptor de proceso permanece en la memoria.

El estado del proceso se convierte EXIT_ZOMBIEy el padre del proceso es notificado de que su proceso hijo ha muerto con la SIGCHLDseñal.

Se supone que el proceso padre ejecuta la llamada al sistema wait () para leer el estado de salida del proceso muerto y otra información. Esto permite que el proceso principal obtenga información del proceso inactivo. Después de llamar a wait (), el proceso zombie se elimina completamente de la memoria.

Esto normalmente sucede muy rápido, por lo que no verá procesos zombies acumulados en su sistema. Sin embargo, si un proceso padre no está programado correctamente y nunca llama a wait (), sus hijos zombis permanecerán en la memoria hasta que se limpien.

Resolución:

No puede matar los procesos zombie como puede matar los procesos normales con la señal SIGKILL: los procesos zombie ya están muertos.

Una forma de matar zombies es enviando la señal SIGCHLD al proceso padre. Esta señal le dice al proceso padre que ejecute la llamada al sistema wait () y limpie a sus hijos zombies. Envíe la señal con el comando kill, reemplazando pid en el siguiente comando con el PID del proceso principal:

kill -s SIGCHLD pid

Cuando finaliza el proceso que creó los zombies, init hereda los procesos de zombies y se convierte en su nuevo padre. (init es el primer proceso iniciado en Linux en el arranque y se le asigna PID 1.)

Nota: - Desde Linux 3.4 en adelante, los procesos pueden emitir la llamada al sistema prctl () con la opción PR_SET_CHILD_SUBREAPER, y como resultado, no el proceso # 1, se convertirán en los padres de sus procesos descendientes huérfanos. Consulte: /unix//a/177361/5132  

INIT luego ejecuta la llamada al sistema wait () para limpiar a sus hijos zombies, por lo que init hará un trabajo corto de los zombies. Puede reiniciar el proceso principal después de cerrarlo.

Arushix
fuente
¿Hay alguna posibilidad de que wait () en sí mismo falle?
Ravi
3
En los sistemas de 64 bits, puede aumentar el PID máximo; consulte unix.stackexchange.com/a/16884/170373
ilkkachu el
1
La parte sobre el reparenting también está mal. unix.stackexchange.com/a/177361/5132 Irónicamente, hacer que los subreapers de programas que no esperan ser sean una forma fácil de causar procesos zombies a largo plazo.
JdeBP
2
El padre ya habrá recibido un SIGCHLD cuando el proceso que ahora es un zombie murió.
Ángel
2
Estrictamente hablando, no es correcto decir que no usa recursos. Todavía está utilizando el PID (que es un recurso limitado), y las estructuras de datos del núcleo para el proceso todavía están asignadas. Por lo general, esto no importará mucho, pero el uso de la memoria del núcleo puede ser significativo en sistemas con memoria muy limitada.
Austin Hemmelgarn
6

Principalmente, los zombis no son un gran problema. Son un proceso 'inactivo', que no requiere tiempo de CPU, y el proceso debería haber liberado cualquier memoria asignada antes de morir. El único recurso que realmente toman es una entrada en su lista de procesos. Dependiendo de su sistema, puede tener un número máximo permitido de hilos, y tener zombis puede hacer que alcance este límite más rápido sin ninguna razón.

Sin embargo: los zombis generalmente aparecen debido a un código incorrecto / defectuoso, donde el programador olvidó verificar los estados de sus procesos secundarios. Esto puede ser intencional, pero a menudo no lo es. El código incorrecto / defectuoso a menudo también manejará la memoria de una manera especial incorrecta y no liberará algunos recursos asignados. Si este es el caso, estos recursos permanecerán asignados para el zombie, hasta que esté completamente terminado.

Editar : si el proceso es un programa de Java, la memoria no liberada no debería ser un problema, ya que el recolector de basura de Java se encarga de todo.

Vince
fuente
3
De hecho, no alimentar la memoria no es problema, es la mayoría de los sistemas operativos en todos los idiomas. El sistema liberará toda la memoria, excepto una pequeña cantidad para el proceso principal.
Val dice Reinstate Monica