Masz problem, jeśli stan Zombie nie jest wyczyszczony?

18

Mam jednostkę produkcyjną, w której proces java stał się Zombie i pozostał tam przez jakiś czas. Jeśli urządzenie zostanie ponownie uruchomione, zostanie wyczyszczone. Jednak urządzenie nie zostało ponownie uruchomione, a inny proces Java został uruchomiony. Czy jest jakiś problem, jeśli ten stan zombie pozostaje bez zmian? Czy wpłynie to w jakikolwiek sposób (wydajność lub spowolnienie)?

Ravi
źródło

Odpowiedzi:

22

Proces Zombie nie będzie miał żadnego wpływu na wydajność ani spowolnienie, ponieważ procesy Zombie nie zużywają żadnych zasobów systemowych.

Uwaga: - W praktyce nadal używa PID (który jest ograniczonym zasobem), a struktury danych jądra dla procesu są nadal przydzielane. Zwykle nie ma to większego znaczenia, ale użycie pamięci jądra może być znaczące w systemach o bardzo ograniczonej pamięci.

Problem spowodowany przez proces zombie

Każdy proces zombie zachowuje swój identyfikator procesu. Systemy Linux mają skończoną liczbę identyfikatorów procesów - domyślnie 32767 w systemach 32-bitowych. Jeśli zombie gromadzą się w bardzo szybkim tempie, cała pula dostępnych PID zostanie ostatecznie przypisana do procesów zombie, uniemożliwiając uruchomienie innych procesów.

Uwaga : w systemach 64-bitowych można zwiększyć maksymalny PID, patrz /unix//a/16884/170373

Jednak kilka wiszących wokół procesów zombie nie stanowi problemu - chociaż wskazują one na błąd w procesie nadrzędnym w systemie.

Wyjaśnienie:

Kiedy proces umiera w systemie Linux, nie wszystkie są natychmiast usuwane z pamięci - jego deskryptor pozostaje w pamięci.

Status procesu staje się, EXIT_ZOMBIEa jego rodzic jest powiadamiany, że jego proces potomny zmarł wraz z SIGCHLDsygnałem.

Proces nadrzędny ma następnie wykonać wywołanie systemowe wait (), aby odczytać status zakończenia martwego procesu i inne informacje. Pozwala to procesowi nadrzędnemu uzyskać informacje z martwego procesu. Po wywołaniu funkcji wait () proces zombie jest całkowicie usuwany z pamięci.

Zwykle dzieje się to bardzo szybko, więc nie zobaczysz procesów zombie gromadzących się w twoim systemie. Jeśli jednak proces nadrzędny nie zostanie odpowiednio zaprogramowany i nigdy nie wywoła funkcji wait (), jego dzieci zombie pozostaną w pamięci, dopóki nie zostaną wyczyszczone.

Rozkład:

Nie możesz zabić procesów zombie, ponieważ możesz zabić normalne procesy za pomocą sygnału SIGKILL - procesy zombie są już martwe.

Jednym ze sposobów zabicia zombie jest wysłanie sygnału SIGCHLD do procesu nadrzędnego. Ten sygnał nakazuje procesowi nadrzędnemu wykonanie wywołania systemowego wait () i wyczyszczenie jego dzieci-zombie. Wyślij sygnał za pomocą polecenia kill, zastępując pid w poniższym poleceniu PID procesu nadrzędnego:

kill -s SIGCHLD pid

Po zakończeniu procesu, który stworzył zombie, init dziedziczy procesy zombie i staje się ich nowym rodzicem. (init jest pierwszym procesem uruchomionym w systemie Linux podczas rozruchu i ma przypisany PID 1.)

Uwaga: - Począwszy od Linuksa 3.4, procesy mogą wywoływać wywołanie systemowe prctl () z opcją PR_SET_CHILD_SUBREAPER, w wyniku czego nie będą przetwarzać # 1, a będą rodzicami swoich osieroconych procesów potomnych. Patrz: /unix//a/177361/5132  

Następnie INIT wykonuje wywołanie systemowe wait () w celu oczyszczenia swoich dzieci zombie, więc init wykona krótką pracę z zombie. Możesz zrestartować proces nadrzędny po jego zamknięciu.

Arushix
źródło
Czy jest jakaś szansa, że ​​samo oczekiwanie () się nie powiedzie?
Ravi
3
W systemach 64-bitowych można zwiększyć maksymalny PID, patrz unix.stackexchange.com/a/16884/170373
ilkkachu
1
Część o ponownym rodzicielstwie jest również błędna. unix.stackexchange.com/a/177361/5132 Jak na ironię, tworzenie podrzędnych programów, których się nie spodziewa, jest łatwym sposobem na wywołanie długotrwałych procesów zombie.
JdeBP
2
Rodzic otrzyma już SIGCHLD, gdy proces, który jest teraz zombie, zmarł.
Ángel
2
Ściśle mówiąc, nie można powiedzieć, że nie używa żadnych zasobów. Nadal używa PID (który jest ograniczonym zasobem), a struktury danych jądra dla procesu są nadal przydzielane. Zwykle nie ma to większego znaczenia, ale użycie pamięci jądra może być znaczące w systemach o bardzo ograniczonej pamięci.
Austin Hemmelgarn
6

Przeważnie zombie nie są dużym problemem. Są to proces „martwy”, który nie wymaga czasu procesora, a cała przydzielona pamięć powinna zostać zwolniona przez proces przed śmiercią. Jedynym zasobem, który faktycznie biorą, jest wpis na liście procesów. W zależności od systemu możesz mieć maksymalną dozwoloną liczbę wątków, a posiadanie zombie może sprawić, że osiągniesz ten limit szybciej bez powodu.

Jednak: Zombie zwykle pojawiają się z powodu złego / błędnego kodu, w którym programista zapomniał sprawdzić stan swoich procesów potomnych. Może to być celowe, ale często tak nie jest. Bad / code buggy często również obsługiwać pamięci w złym specjalny sposób, a nie zwolnić przydzielone zasoby. W takim przypadku zasoby te pozostaną przydzielone zombie, dopóki nie zostanie całkowicie zakończone.

Edycja : Jeśli jest to program Java, nie zwalniana pamięć nie powinna stanowić problemu, ponieważ śmieciarz Java zajmuje się wszystkim.

Vince
źródło
3
W rzeczywistości brak pamięci zasilania nie jest problemem, ponieważ większość systemów operacyjnych we wszystkich językach. System zwolni całą pamięć oprócz niewielkiej ilości na proces nadrzędny.
val mówi Przywróć Monikę