Adakah masalah jika status Zombie tidak dihapus?

18

Saya memiliki unit produksi di mana proses java telah menjadi Zombie dan tetap di sana selama beberapa waktu sekarang. Jika unit dihidupkan ulang, maka akan dihapus. Namun, unit tidak direstart dan proses java lain sudah berjalan dan berjalan. Apakah ada masalah jika kondisi zombie ini tetap seperti itu tanpa membersihkannya? Apakah akan memengaruhi dengan cara apa pun (kinerja atau kelambatan)?

Ravi
sumber

Jawaban:

22

Proses zombie tidak akan berdampak pada kinerja atau kelambatan karena proses zombie tidak menggunakan sumber daya sistem apa pun.

Catatan: - Secara praktis, masih menggunakan PID (yang merupakan sumber daya terbatas), dan struktur data kernel untuk proses masih dialokasikan. Biasanya, ini tidak masalah, tetapi penggunaan memori kernel bisa signifikan pada sistem dengan memori yang sangat terbatas.

Masalah yang disebabkan oleh proses zombie

Setiap proses zombie mempertahankan ID prosesnya. Sistem Linux memiliki jumlah ID proses yang terbatas - 32767 secara default pada sistem 32-bit. Jika zombie terakumulasi pada tingkat yang sangat cepat, seluruh kumpulan PID yang tersedia pada akhirnya akan ditugaskan untuk proses zombie, mencegah proses lain dari peluncuran.

Catatan : Pada sistem 64-bit, Anda dapat meningkatkan PID maksimum, lihat /unix//a/16884/170373

Namun, beberapa proses zombie yang berkeliaran tidak masalah - meskipun mereka menunjukkan bug dengan proses induknya di sistem Anda.

Penjelasan:

Ketika sebuah proses mati di Linux, itu tidak semua dihapus dari memori segera - deskriptor prosesnya tetap dalam memori.

Status proses menjadi EXIT_ZOMBIEdan proses orangtua diberitahu bahwa proses anaknya telah mati dengan SIGCHLDsinyal.

Proses induk kemudian diharapkan untuk menjalankan sistem panggilan wait () untuk membaca status keluar proses yang mati dan informasi lainnya. Ini memungkinkan proses induk untuk mendapatkan informasi dari proses yang mati. Setelah wait () dipanggil, proses zombie sepenuhnya dihapus dari memori.

Ini biasanya terjadi sangat cepat, sehingga Anda tidak akan melihat proses zombie menumpuk di sistem Anda. Namun, jika proses induk tidak diprogram dengan benar dan tidak pernah memanggil tunggu (), anak-anak zombie-nya akan bertahan dalam memori sampai mereka dibersihkan.

Resolusi:

Anda tidak dapat membunuh proses zombie karena Anda dapat membunuh proses normal dengan sinyal SIGKILL - proses zombie sudah mati.

Salah satu cara untuk membunuh zombie adalah dengan mengirimkan sinyal SIGCHLD ke proses induk. Sinyal ini memberi tahu proses induk untuk menjalankan panggilan tunggu () sistem dan membersihkan anak-anak zombie-nya. Kirim sinyal dengan perintah kill, ganti pid pada perintah di bawah ini dengan PID proses induk:

kill -s SIGCHLD pid

Ketika proses yang menciptakan zombie berakhir, init mewarisi proses zombie dan menjadi orang tua baru mereka. (init adalah proses pertama yang dimulai pada Linux saat boot dan diberikan PID 1.)

Catatan: - Dari Linux 3.4 dan selanjutnya proses dapat mengeluarkan panggilan sistem prctl () dengan opsi PR_SET_CHILD_SUBREAPER, dan sebagai hasilnya, bukan proses # 1, akan menjadi induk dari proses turunan yatim piatu mereka. Refer: /unix//a/177361/5132  

INIT kemudian mengeksekusi sistem panggilan wait () untuk membersihkan anak-anak zombie-nya, jadi init akan membuat zombie pendek bekerja. Anda dapat memulai kembali proses induk setelah menutupnya.

Arushix
sumber
Apakah ada kemungkinan di mana wait () sendiri gagal?
Ravi
3
Pada sistem 64-bit, Anda dapat meningkatkan PID maksimum, lihat unix.stackexchange.com/a/16884/170373
ilkkachu
1
Bagian tentang reparenting juga salah. unix.stackexchange.com/a/177361/5132 Ironisnya, membuat program subreaper yang tidak diharapkan adalah cara mudah untuk menyebabkan proses zombie jangka panjang.
JdeBP
2
Orang tua sudah akan menerima SIGCHLD ketika proses yang sekarang menjadi zombie mati.
Ángel
2
Sebenarnya itu tidak benar untuk mengatakan bahwa itu tidak menggunakan sumber daya. Masih menggunakan PID (yang merupakan sumber daya terbatas), dan struktur data kernel untuk proses masih dialokasikan. Biasanya, ini tidak masalah, tetapi penggunaan memori kernel bisa signifikan pada sistem dengan memori yang sangat terbatas.
Austin Hemmelgarn
6

Sebagian besar, zombie bukan masalah besar. Mereka adalah proses 'mati'-ish, yang tidak membutuhkan waktu CPU, dan setiap memori yang dialokasikan seharusnya dibebaskan oleh proses sebelum mati. Satu-satunya sumber daya yang mereka ambil adalah entri dalam daftar proses Anda. Bergantung pada sistem Anda, Anda dapat memiliki jumlah utas maksimum yang dibolehkan, dan memiliki zombie dapat membuat Anda mencapai batas ini lebih cepat tanpa alasan.

Namun: Zombies biasanya muncul karena kode buruk / bermasalah, di mana programmer lupa memeriksa status proses anaknya. Ini bisa disengaja, tetapi seringkali tidak. Kode buruk / kereta sering kali juga menangani memori dengan cara khusus yang buruk , dan Tidak membebaskan beberapa sumber daya yang dialokasikan. Jika ini masalahnya, sumber daya ini akan tetap dialokasikan untuk zombie, sampai sepenuhnya dihentikan.

Sunting : Jika prosesnya adalah program java, memori yang tidak dibebaskan seharusnya tidak menjadi masalah, karena pengumpul sampah java menangani semuanya.

Vince
sumber
3
Bahkan, bukan memori feed bukan masalah OS kebanyakan dalam semua bahasa. Sistem akan membebaskan semua memori kecuali jumlah kecil untuk proses induk.
val berkata Reinstate Monica