Algum problema se o estado Zombie não for limpo?

18

Eu tenho uma unidade de produção na qual o processo java se tornou Zombie e permaneceu lá por algum tempo. Se a unidade for reiniciada, ela será limpa. No entanto, a unidade não é reiniciada e outro processo java está em execução. Existe algum problema se esse estado zumbi permanecer como está sem limpá-lo? Isso afetará de alguma forma (desempenho ou lentidão)?

Ravi
fonte

Respostas:

22

O processo zumbi não afeta o desempenho ou a lentidão, pois os processos zumbis não consomem nenhum recurso do sistema.

Nota: - Praticamente, ele ainda está usando o PID (que é um recurso limitado), e as estruturas de dados do kernel para o processo ainda estão alocadas. Normalmente, isso não importa muito, mas o uso da memória do kernel pode ser significativo em sistemas com memória muito limitada.

Problema causado pelo processo zumbi

Cada processo zumbi mantém seu ID do processo. Os sistemas Linux têm um número finito de IDs de processo - 32767 por padrão em sistemas de 32 bits. Se os zumbis estiverem acumulando a uma taxa muito rápida, todo o conjunto de PIDs disponíveis acabará sendo atribuído aos processos zombie, impedindo o lançamento de outros processos.

Nota : Em sistemas de 64 bits, você pode aumentar o PID máximo, consulte /unix//a/16884/170373

No entanto, alguns processos zumbis por aí não são problema - embora indiquem um erro no processo pai no sistema.

Explicação:

Quando um processo morre no Linux, ele não é todo removido da memória imediatamente - seu descritor de processo permanece na memória.

O status do processo se torna EXIT_ZOMBIEe o pai do processo é notificado de que seu processo filho morreu com o SIGCHLDsinal.

O processo pai deve então executar a chamada do sistema wait () para ler o status de saída do processo morto e outras informações. Isso permite que o processo pai obtenha informações do processo morto. Depois que wait () é chamado, o processo zumbi é completamente removido da memória.

Isso normalmente acontece muito rapidamente, então você não verá processos zumbis se acumulando no seu sistema. No entanto, se um processo pai não for programado corretamente e nunca chamar wait (), seus filhos zumbis permanecerão na memória até serem limpos.

Resolução:

Você não pode matar processos zumbis, como você pode matar processos normais com o sinal SIGKILL - processos zumbis já estão mortos.

Uma maneira de matar zumbis é enviando o sinal SIGCHLD para o processo pai. Esse sinal informa ao processo pai para executar a chamada do sistema wait () e limpar seus filhos zumbis. Envie o sinal com o comando kill, substituindo pid no comando abaixo pelo PID do processo pai:

kill -s SIGCHLD pid

Quando o processo que criou os zumbis termina, o init herda os processos do zumbi e se torna seu novo pai. (init é o primeiro processo iniciado no Linux na inicialização e recebe o PID 1.)

Nota: - A partir do Linux 3.4, os processos podem emitir a chamada do sistema prctl () com a opção PR_SET_CHILD_SUBREAPER e, como resultado, eles, não o processo nº 1, se tornarão os pais de seus processos descendentes órfãos. Consulte: /unix//a/177361/5132  

O INIT executa a chamada do sistema wait () para limpar seus filhos zumbis, de modo que o init fará pouco trabalho com os zumbis. Você pode reiniciar o processo pai após fechá-lo.

Arushix
fonte
Existe alguma chance de o wait () falhar?
Ravi
3
Em sistemas de 64 bits, você pode aumentar o máximo PID, ver unix.stackexchange.com/a/16884/170373
ilkkachu
11
A parte sobre reparação também está errada. irix.stackexchange.com/a/177361/5132 Ironicamente, criar sub-leitores de programas que não esperam ser é uma maneira fácil de causar processos zumbis a longo prazo.
JdeBP
2
Os pais já terão recebido um SIGCHLD quando o processo que agora é um zumbi morreu.
Ángel
2
A rigor, não é correto dizer que não utiliza recursos. Ele ainda está usando o PID (que é um recurso limitado) e as estruturas de dados do kernel para o processo ainda estão alocadas. Normalmente, isso não importa muito, mas o uso da memória do kernel pode ser significativo em sistemas com memória muito limitada.
Austin Hemmelgarn
6

Principalmente, zumbis não são um grande problema. Eles são um processo "morto", que não leva tempo de CPU, e qualquer memória alocada deveria ter sido liberada pelo processo antes de morrer. O único recurso que eles realmente usam é uma entrada na sua lista de processos. Dependendo do seu sistema, você pode ter um número máximo permitido de threads e ter zumbis pode fazer com que você atinja esse limite mais rapidamente sem motivo.

No entanto: os zumbis geralmente aparecem devido ao código incorreto / com erros, onde o programador esqueceu de verificar os estados de seus processos filhos. Isso pode ser intencional, mas geralmente não é. O código incorreto / com erros também costuma lidar com a memória de uma maneira especial ruim e não libera alguns recursos alocados. Se for esse o caso, esses recursos permanecerão alocados para o zumbi, até que seja totalmente finalizado.

Edit : Se o processo for um programa java, a memória não liberada não deve ser um problema, pois o coletor de lixo java cuida de tudo.

Vince
fonte
3
De fato, não alimentar a memória não é problema para a maioria dos sistemas operacionais em todos os idiomas. O sistema liberará toda a memória, exceto uma pequena quantidade para o processo pai.
val diz Reinstate Monica