Qualche problema se lo stato Zombie non viene cancellato?


18

Ho un'unità di produzione in cui il processo Java è diventato Zombi ed è rimasto lì per qualche tempo. Se l'unità viene riavviata, verrà cancellata. Tuttavia, l'unità non viene riavviata e un altro processo Java è attivo e in esecuzione. C'è qualche problema se questo stato di zombi rimane com'è senza cancellarlo? Interesserà in qualche modo (prestazioni o lentezza)?

Risposte:


22

Il processo Zombie non avrà alcun effetto sulle prestazioni o sulla lentezza poiché i processi Zombie non consumano risorse di sistema.

Nota: - Praticamente, sta ancora usando il PID (che è una risorsa limitata) e le strutture di dati del kernel per il processo sono ancora allocate. Di solito, questo non ha molta importanza, ma l'utilizzo della memoria del kernel può essere significativo su sistemi con memoria molto limitata.

Problema causato dal processo di zombi

Ogni processo di zombi conserva il suo ID processo. I sistemi Linux hanno un numero finito di ID processo - 32767 per impostazione predefinita su sistemi a 32 bit. Se gli zombi si accumulano a una velocità molto elevata, l'intero pool di PID disponibili verrà assegnato ai processi zombi, impedendo l'avvio di altri processi.

Nota : sui sistemi a 64 bit, è possibile aumentare il PID massimo, consultare /unix//a/16884/170373

Tuttavia, alcuni processi di zombi in giro non sono un problema, anche se indicano un bug con il loro processo genitore sul tuo sistema.

Spiegazione:

Quando un processo muore su Linux, non tutto viene rimosso immediatamente dalla memoria, il suo descrittore di processo rimane in memoria.

Lo stato del processo diventa EXIT_ZOMBIEe il genitore del processo viene informato che il suo processo figlio è morto con il SIGCHLDsegnale.

Il processo padre dovrebbe quindi eseguire la chiamata di sistema wait () per leggere lo stato di uscita del processo morto e altre informazioni. Ciò consente al processo parent di ottenere informazioni dal processo dead. Dopo aver chiamato wait (), il processo zombie viene completamente rimosso dalla memoria.

Questo di solito accade molto rapidamente, quindi non vedrai accumularsi processi di zombi sul tuo sistema. Tuttavia, se un processo genitore non è programmato correttamente e non chiama mai wait (), i suoi figli zombi rimarranno nella memoria finché non vengono ripuliti.

Risoluzione:

Non puoi uccidere i processi di zombi poiché puoi uccidere i normali processi con il segnale SIGKILL: i processi di zombi sono già morti.

Un modo per uccidere gli zombi è inviare il segnale SIGCHLD al processo genitore. Questo segnale dice al processo genitore di eseguire la chiamata di sistema wait () e ripulire i suoi figli zombi. Invia il segnale con il comando kill, sostituendo pid nel comando seguente con il PID del processo parent:

kill -s SIGCHLD pid

Quando termina il processo che ha creato gli zombi, init eredita i processi di zombi e diventa il loro nuovo genitore. (init è il primo processo avviato su Linux all'avvio e viene assegnato PID 1.)

Nota: - Da Linux 3.4 in poi i processi possono emettere la chiamata di sistema prctl () con l'opzione PR_SET_CHILD_SUBREAPER e di conseguenza, non il processo n. 1, diventeranno i genitori dei loro processi discendenti orfani. Consultare: /unix//a/177361/5132  

INIT quindi esegue la chiamata di sistema wait () per ripulire i suoi figli di zombi, quindi init farà un breve lavoro degli zombi. È possibile riavviare il processo padre dopo averlo chiuso.


C'è qualche possibilità in cui wait () stesso fallisce?
Ravi,

3
Sui sistemi a 64 bit, è possibile aumentare il PID massimo, consultare unix.stackexchange.com/a/16884/170373
ilkkachu,

1
Anche la parte relativa al rinnovo è sbagliata. unix.stackexchange.com/a/177361/5132 Ironia della sorte, creare programmi di subreaper che non si aspettano di essere è un modo semplice per causare processi a lungo termine di zombi.
JdeBP,

2
Il genitore avrà già ricevuto un SIGCHLD quando il processo che ora è uno zombi è morto.
Ángel,

2
A rigor di termini non è corretto affermare che non utilizza risorse. Sta ancora usando il PID (che è una risorsa limitata) e le strutture di dati del kernel per il processo sono ancora allocate. Di solito, questo non ha molta importanza, ma l'utilizzo della memoria del kernel può essere significativo su sistemi con memoria molto limitata.
Austin Hemmelgarn,

6

Per lo più, gli zombi non sono un grosso problema. Sono un processo "morto", che non richiede tempo di CPU, e qualsiasi memoria allocata avrebbe dovuto essere liberata dal processo prima di morire. L'unica risorsa che effettivamente prendono è una voce nell'elenco dei processi. A seconda del tuo sistema, puoi avere un numero massimo consentito di thread e avere zombi può farti raggiungere questo limite più velocemente senza motivo.

Tuttavia: gli zombi di solito compaiono a causa di un codice errato / errato, in cui il programmatore ha dimenticato di controllare gli stati dei suoi processi figlio. Questo può essere intenzionale, ma spesso non lo è. Il codice errato / errato gestirà spesso anche la memoria in un modo speciale negativo e non libererà alcune risorse allocate. In tal caso, queste risorse rimarranno allocate per lo zombi, fino a quando non sarà completamente terminato.

Modifica : se il processo è un programma java, la memoria non liberata non dovrebbe essere un problema, poiché java garbage collector si occupa di tutto.


3
In effetti, non alimentare la memoria non è un problema, ma la maggior parte dei sistemi operativi in ​​tutte le lingue. Il sistema libererà tutta la memoria tranne una piccola quantità per il processo padre.
dice Val Reinstate Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.