Gibt es ein Problem, wenn der Zombie-Status nicht gelöscht wurde?

18

Ich habe eine Produktionseinheit, in der der Java-Prozess zu Zombie geworden ist und die seit einiger Zeit dort ist. Wenn das Gerät neu gestartet wird, wird es gelöscht. Das Gerät wird jedoch nicht neu gestartet, und ein anderer Java-Prozess ist aktiv. Gibt es ein Problem, wenn dieser Zombie-Status so bleibt, wie er ist, ohne ihn zu löschen? Beeinträchtigt es in irgendeiner Weise (Leistung oder Langsamkeit)?

Ravi
quelle

Antworten:

22

Der Zombie-Prozess hat keine Auswirkungen auf die Leistung oder Langsamkeit, da die Zombie-Prozesse keine Systemressourcen verbrauchen.

Hinweis: - In der Praxis wird immer noch die PID (die eine begrenzte Ressource ist) verwendet, und die Kerneldatenstrukturen für den Prozess werden weiterhin zugewiesen. Normalerweise spielt dies keine große Rolle, aber die Speichernutzung des Kernels kann auf Systemen mit sehr begrenztem Speicher erheblich sein.

Problem durch Zombie-Prozess verursacht

Jeder Zombie-Prozess behält seine Prozess-ID. Linux-Systeme haben eine begrenzte Anzahl von Prozess-IDs - 32767 standardmäßig auf 32-Bit-Systemen. Wenn sich Zombies sehr schnell ansammeln, wird der gesamte Pool verfügbarer PIDs schließlich Zombie-Prozessen zugewiesen, sodass andere Prozesse nicht gestartet werden können.

Hinweis : Auf 64-Bit-Systemen können Sie die maximale PID erhöhen (siehe /unix//a/16884/170373)

Ein paar Zombie-Prozesse, die herumhängen, sind jedoch kein Problem - obwohl sie auf einen Fehler mit ihrem übergeordneten Prozess auf Ihrem System hinweisen.

Erläuterung:

Wenn ein Prozess unter Linux abstürzt, wird nicht sofort alles aus dem Speicher entfernt - sein Prozessdeskriptor bleibt im Speicher.

Der Status EXIT_ZOMBIEdes Prozesses wird und der übergeordnete Prozess wird benachrichtigt, dass sein untergeordneter Prozess mit dem SIGCHLDSignal gestorben ist.

Der übergeordnete Prozess soll dann den Systemaufruf wait () ausführen, um den Beendigungsstatus des toten Prozesses und andere Informationen zu lesen. Auf diese Weise kann der übergeordnete Prozess Informationen vom toten Prozess abrufen. Nachdem wait () aufgerufen wurde, wird der Zombie-Prozess vollständig aus dem Speicher entfernt.

Dies geschieht normalerweise sehr schnell, sodass sich auf Ihrem System keine Zombie-Prozesse ansammeln. Wenn ein übergeordneter Prozess jedoch nicht ordnungsgemäß programmiert ist und nie wait () aufruft, bleiben die untergeordneten Zombies im Speicher, bis sie bereinigt sind.

Auflösung:

Sie können keine Zombie-Prozesse beenden, da Sie normale Prozesse mit dem SIGKILL-Signal beenden können - Zombie-Prozesse sind bereits beendet.

Eine Möglichkeit, Zombies zu töten, besteht darin, das SIGCHLD-Signal an den übergeordneten Prozess zu senden. Dieses Signal weist den übergeordneten Prozess an, den Systemaufruf wait () auszuführen und die untergeordneten Zombies zu bereinigen. Senden Sie das Signal mit dem Befehl kill und ersetzen Sie pid im folgenden Befehl durch die PID des übergeordneten Prozesses:

kill -s SIGCHLD pid

Wenn der Prozess, der die Zombies erstellt hat, beendet ist, erbt init die Zombie-Prozesse und wird zu ihrem neuen übergeordneten Element. (init ist der erste Prozess, der beim Booten unter Linux gestartet wird, und ihm wird PID 1 zugewiesen.)

Hinweis: Ab Linux 3.4 können Prozesse den Systemaufruf prctl () mit der Option PR_SET_CHILD_SUBREAPER ausgeben, sodass sie, nicht Prozess Nr. 1, die Eltern ihrer verwaisten Nachfolgeprozesse werden. Siehe: /unix//a/177361/5132  

INIT führt dann den Systemaufruf wait () aus, um die untergeordneten Zombies zu bereinigen, sodass init die Zombies in Kürze bearbeitet. Sie können den übergeordneten Prozess nach dem Schließen neu starten.

Arushix
quelle
Gibt es eine Chance, wo wait () selbst fehlschlägt?
Ravi
3
Auf 64-Bit-Systemen können Sie die maximale PID erhöhen (siehe unix.stackexchange.com/a/16884/170373
ilkkachu
1
Der Teil über das Reparenting ist auch falsch. unix.stackexchange.com/a/177361/5132 Ironischerweise Programme subreapers machen , die nicht erwarten , zu sein , ist eine einfache Möglichkeit , langfristigen Zombie - Prozesse zu führen.
JdeBP
2
Das Elternteil hat bereits eine SIGCHLD erhalten, als der Prozess, der jetzt ein Zombie ist, starb.
Ángel
2
Streng genommen ist es nicht richtig zu sagen, dass es keine Ressourcen verbraucht. Es wird weiterhin die PID (die eine begrenzte Ressource ist) verwendet, und die Kerneldatenstrukturen für den Prozess werden weiterhin zugewiesen. Normalerweise spielt dies keine große Rolle, aber die Speichernutzung des Kernels kann auf Systemen mit sehr begrenztem Speicher erheblich sein.
Austin Hemmelgarn
6

Meistens sind Zombies kein großes Problem. Es handelt sich um einen "toten" Prozess, der keine CPU-Zeit in Anspruch nimmt, und der zugewiesene Speicher sollte vor dem Tod durch den Prozess freigegeben worden sein. Die einzige Ressource, die sie tatsächlich in Anspruch nehmen, ist ein Eintrag in Ihrer Prozessliste. Abhängig von Ihrem System können Sie eine maximal zulässige Anzahl von Threads festlegen, und mit Zombies können Sie dieses Limit ohne Grund schneller erreichen.

Allerdings: Zombies erscheinen normalerweise aufgrund von fehlerhaftem / fehlerhaftem Code, bei dem der Programmierer vergessen hat , den Status seiner untergeordneten Prozesse zu überprüfen. Dies kann beabsichtigt sein, ist es aber oft nicht. Fehlerhafter / fehlerhafter Code behandelt häufig auch Speicher auf eine schlechte spezielle Art und Weise und gibt einige zugewiesene Ressourcen nicht frei. In diesem Fall bleiben diese Ressourcen für den Zombie reserviert, bis er vollständig beendet ist.

Bearbeiten : Wenn der Prozess ein Java-Programm ist, sollte nicht freigegebener Speicher kein Problem sein, da der Java-Garbage-Collector sich um alles kümmert.

Vince
quelle
3
In der Tat, nicht Feed-Speicher ist es nicht die meisten Betriebssysteme in allen Sprachen. Das System gibt den gesamten Speicher mit Ausnahme des winzigen Betrags für den übergeordneten Prozess frei.
Val sagt Reinstate Monica