Zombi durumu temizlenmezse herhangi bir sorun var mı?


18

Java sürecinin Zombi haline geldiği ve bir süre orada kaldığı üretim birimim var. Ünite yeniden başlatılırsa temizlenecektir. Ancak, birim yeniden başlatılmaz ve başka bir java işlemi çalışır durumdadır. Bu zombi durumu temizlenmeden olduğu gibi kalırsa herhangi bir sorun var mı? Herhangi bir şekilde etkilenecek mi (performans veya yavaşlık)?

Yanıtlar:


22

Zombi işlemlerinde herhangi bir sistem kaynağı kullanılmadığından , zombi işleminin performans veya yavaşlık üzerinde herhangi bir etkisi olmaz.

Not: - Pratik olarak, hala sınırlı bir kaynak olan PID'yi kullanıyor ve işlem için çekirdek veri yapıları hala tahsis ediliyor. Genellikle, bu çok önemli değildir, ancak çok sınırlı belleğe sahip sistemlerde çekirdek bellek kullanımı önemli olabilir.

Zombi sürecinin neden olduğu sorun

Her zombi işlemi, işlem kimliğini korur. Linux sistemleri süreç kimlikleri sonlu sayıda - 32767 32-bitin systems.If zombiler üzerinde varsayılan olarak çok hızlı bir oranda birikmektedir, mevcut PID'lerin tüm havuz sonunda, zombi süreçlerine atanan başlatmaktan diğer işlemleri engelleyen hale gelecektir.

Not : 64 bit sistemlerde, maksimum PID'yi artırabilirsiniz, bkz. Https://unix.stackexchange.com/a/16884/170373

Ancak, etrafta asılı olan birkaç zombi işlemi sorun değildir - sisteminizdeki ana işlemleriyle ilgili bir hata olduğunu göstermesine rağmen.

Açıklama:

Bir işlem Linux'ta öldüğünde, bunların tümü bellekten hemen kaldırılmaz - işlem tanımlayıcısı bellekte kalır.

Sürecin durumu olur EXIT_ZOMBIEve sürecin ebeveynine alt sürecinin SIGCHLDsinyal ile öldüğü bildirilir .

Üst işlemin, ölü işlemin çıkış durumunu ve diğer bilgileri okumak için wait () sistem çağrısını yürütmesi beklenir. Bu, ana sürecin ölü süreçten bilgi almasını sağlar. Wait () çağrıldıktan sonra zombi işlemi bellekten tamamen kaldırılır.

Bu normalde çok hızlı gerçekleşir, bu nedenle sisteminizde biriken zombi süreçlerini görmezsiniz. Ancak, bir üst süreç düzgün programlanmadıysa ve asla wait () çağrısı yapmazsa, zombi çocukları temizlenene kadar bellekte kalırlar.

Çözüm:

SIGKILL sinyali ile normal süreçleri öldürebileceğiniz için zombi süreçlerini öldüremezsiniz - zombi süreçleri zaten ölmüştür.

Zombi öldürmenin bir yolu, ana işleme SIGCHLD sinyalinin gönderilmesidir. Bu sinyal ebeveyn işlemine wait () sistem çağrısını yürütmesini ve zombi çocuklarını temizlemesini söyler. Aşağıdaki komuttaki pid'i üst sürecin PID'si ile değiştirerek sinyali kill komutuyla gönderin:

kill -s SIGCHLD pid

Zombileri oluşturan süreç sona erdiğinde, init zombi süreçlerini devralır ve yeni ebeveynleri olur. (init, Linux'ta önyükleme sırasında başlatılan ve PID 1'e atanan ilk işlemdir.)

Not: - Linux 3.4'ten itibaren işlemler, PR_SET_CHILD_SUBREAPER seçeneğiyle prctl () sistem çağrısını düzenleyebilir ve sonuç olarak, # 1 işlemi değil, öksüz torunlarının üst öğesi olurlar. Bakınız: /unix//a/177361/5132  

INIT daha sonra zombi çocuklarını temizlemek için wait () sistem çağrısını yürütür, böylece init zombilerin kısa çalışmasını yapar. Üst işlemi kapattıktan sonra yeniden başlatabilirsiniz.


Wait () öğesinin başarısız olma ihtimali var mı?
Ravi

3
64 bit sistemlerde, maksimum PID değerini artırabilirsiniz, bkz. Unix.stackexchange.com/a/16884/170373
ilkkachu

1
Yeniden evlenme ile ilgili kısım da yanlış. unix.stackexchange.com/a/177361/5132 İronik olarak, beklemediğiniz programları alt okuyucular yapmak uzun vadeli zombi süreçlerine neden olmanın kolay bir yoludur.
JdeBP

2
Şu anda bir zombi olan süreç öldüğünde ebeveyn zaten bir SIGCHLD almış olacak.
Ángel

2
Açıkçası, hiç kaynak kullanmadığını söylemek doğru değil. Hala PID (sınırlı bir kaynaktır) kullanıyor ve işlem için çekirdek veri yapıları hala tahsis ediliyor. Genellikle, bu çok önemli değildir, ancak çok sınırlı belleğe sahip sistemlerde çekirdek bellek kullanımı önemli olabilir.
Austin Hemmelgarn

6

Çoğunlukla zombiler büyük bir mesele değildir. Bunlar, CPU zamanını almayan 'ölü' bir süreçtir ve tahsis edilen herhangi bir bellek ölmeden önce işlem tarafından serbest bırakılmış olmalıdır . Gerçekte aldıkları tek kaynak işlem listenizdeki bir girdidir. Sisteminize bağlı olarak, izin verilen maksimum sayıda iş parçacığına sahip olabilirsiniz ve zombilere sahip olmak bu sınıra hiçbir sebeple daha hızlı ulaşmanızı sağlayabilir.

Ancak: Zombiler genellikle programcının alt süreçlerinin durumlarını kontrol etmeyi unuttuğu kötü / buggy kodu nedeniyle ortaya çıkar . Bu kasıtlı olabilir, ancak genellikle değildir. Kötü / arabası kod genellikle aynı zamanda bir bellek idare edecek kötü özel bir şekilde ve değil bazı tahsis özkaynakları serbest. Bu durumda, bu kaynaklar tamamen sonlanıncaya kadar zombi için tahsis edilecektir.

Düzenleme : İşlem bir java programı ise, java çöp toplayıcı her şeyi hallediyor gibi, serbest hafıza bir sorun olmamalıdır.


3
Aslında, besleme belleği tüm dillerde çoğu işletim sistemi sorunu değil. Sistem, ana işlem için küçük miktarlar hariç tüm belleği serbest bırakır.
val diyor Reinstate Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.