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

15

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

    
por Ravi 26.06.2018 / 11:49

2 respostas

18

O processo de zumbis não afetará o desempenho ou a lentidão, pois os processos de zumbi não usam recursos do sistema.

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

Problem caused by zombie process

Each zombie process retains its process ID . Linux systems have a finite number of process IDs – 32767 by default on 32-bit systems.If zombies are accumulating at a very quick rate ,the entire pool of available PIDs will eventually become assigned to zombie processes, preventing other processes from launching.

     

Observação : Em sistemas de 64 bits, você pode aumentar o PID máximo, consulte link

No entanto, alguns processos de zumbis não são problema - embora eles indiquem um bug no processo pai em seu sistema.

Explicação:

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

O status do processo passa a EXIT_ZOMBIE e o pai do processo é notificado de que o processo filho morreu com o sinal SIGCHLD .

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 inativo. Depois que wait () é chamado, o processo zumbi é completamente removido da memória.

Isso normalmente acontece muito rapidamente, então você não verá processos de zumbis acumulados em seu sistema. No entanto, se um processo pai não for programado corretamente e nunca chamar espera (), seus filhos zumbis permanecerão na memória até que eles sejam limpos.

Resolução:

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

Uma maneira de matar zumbis é enviar o sinal SIGCHLD para o processo pai. Este sinal diz 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 zumbis e se torna seu novo pai. (o init é o primeiro processo iniciado no Linux durante a inicialização e recebe o PID 1.)

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

INIT, em seguida, executa a chamada do sistema wait () para limpar seus filhos zumbis, assim o init fará com que os zumbis trabalhem rapidamente. Você pode reiniciar o processo pai depois de fechá-lo.

    
por 26.06.2018 / 12:04
5

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

No entanto: os zumbis geralmente aparecem por causa do código com erros / bugs, onde o programador esqueceu para verificar os estados de seus processos filhos. Isso pode ser intencional, mas muitas vezes não é. O código com bugs / defeitos muitas vezes também lida com a memória de uma maneira ruim especial , e Não libera alguns recursos alocados. Se este for o caso, esses recursos permanecerão alocados para o zumbi até que ele seja totalmente encerrado.

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

    
por 26.06.2018 / 11:59

Tags