มีปัญหาอะไรบ้างหากสถานะ Zombie ยังไม่หายไป?


18

ฉันมีหน่วยการผลิตที่กระบวนการจาวากลายเป็นซอมบี้และยังคงอยู่ที่นั่นชั่วระยะเวลาหนึ่ง หากหน่วยถูกรีสตาร์ทแล้วมันจะถูกล้าง อย่างไรก็ตามหน่วยจะไม่รีสตาร์ทและกระบวนการ java อื่นกำลังทำงาน จะมีปัญหาอะไรไหมถ้าสถานะซอมบี้นี้ยังคงอยู่เหมือนเดิมโดยไม่ต้องเคลียร์มัน? มันจะมีผลกระทบในทางใด (ประสิทธิภาพหรือความช้า) หรือไม่?

คำตอบ:


22

กระบวนการซอมบี้จะไม่มีผลกระทบต่อประสิทธิภาพหรือความล่าช้าเนื่องจากกระบวนการซอมบี้จะไม่ใช้ทรัพยากรระบบใด ๆ

หมายเหตุ: - ใน ทางปฏิบัติมันยังคงใช้ PID (ซึ่งเป็นทรัพยากรที่ จำกัด ) และโครงสร้างข้อมูลเคอร์เนลสำหรับกระบวนการยังคงถูกจัดสรร โดยปกติแล้วสิ่งนี้จะไม่สำคัญมากนัก แต่การใช้หน่วยความจำเคอร์เนลอาจมีความสำคัญกับระบบที่มีหน่วยความจำ จำกัด มาก

ปัญหาที่เกิดจากกระบวนการซอมบี้

แต่ละกระบวนการซอมบี้เก็บรหัสกระบวนการของมัน ระบบ Linux มี ID กระบวนการจำนวน จำกัด - 32767โดยค่าเริ่มต้นในระบบ 32 บิตหากซอมบี้สะสมในอัตราที่รวดเร็วมากพูลทั้งหมดของ PID ที่มีอยู่จะถูกกำหนดให้กับกระบวนการซอมบี้ในที่สุดป้องกันไม่ให้กระบวนการอื่นเปิดตัว

หมายเหตุ : สำหรับระบบ 64 บิตคุณสามารถเพิ่ม PID สูงสุดได้ที่/unix//a/16884/170373

อย่างไรก็ตามกระบวนการซอมบี้สองสามอันที่แขวนอยู่รอบ ๆ นั้นไม่มีปัญหา - แม้ว่าพวกมันจะบ่งบอกถึงข้อผิดพลาดกับกระบวนการหลักในระบบของคุณ

คำอธิบาย:

เมื่อกระบวนการตายบน Linux กระบวนการทั้งหมดจะไม่ถูกลบออกจากหน่วยความจำทันที - กระบวนการของกระบวนการจะยังคงอยู่ในหน่วยความจำ

สถานะของกระบวนการจะกลายเป็นEXIT_ZOMBIEและผู้ปกครองของกระบวนการจะได้รับแจ้งว่ากระบวนการลูกของมันเสียชีวิตด้วยSIGCHLDสัญญาณ

กระบวนการหลักควรดำเนินการเรียกใช้ระบบ wait () เพื่ออ่านสถานะการออกของกระบวนการที่ตายแล้วและข้อมูลอื่น ๆ สิ่งนี้อนุญาตให้กระบวนการพาเรนต์รับข้อมูลจากกระบวนการที่ตายแล้ว หลังจากการรอ () ถูกเรียกกระบวนการซอมบี้จะถูกลบออกจากหน่วยความจำอย่างสมบูรณ์

ปกติแล้วจะเกิดขึ้นอย่างรวดเร็วดังนั้นคุณจะไม่เห็นกระบวนการซอมบี้สะสมในระบบของคุณ อย่างไรก็ตามหากกระบวนการผู้ปกครองไม่ได้ตั้งโปรแกรมอย่างถูกต้องและไม่เคยรอสาย () เด็ก ๆ ของมันจะติดอยู่ในหน่วยความจำจนกว่าพวกเขาจะทำความสะอาด

ความละเอียด:

คุณไม่สามารถฆ่ากระบวนการซอมบี้ในขณะที่คุณสามารถฆ่ากระบวนการปกติด้วยสัญญาณ SIGKILL - กระบวนการซอมบี้นั้นตายไปแล้ว

วิธีหนึ่งในการฆ่าซอมบี้คือการส่งสัญญาณ SIGCHLD ไปยังกระบวนการหลัก สัญญาณนี้บอกกระบวนการหลักให้ดำเนินการเรียกใช้ระบบ wait () และทำความสะอาดลูกซอมบี้ของมัน ส่งสัญญาณด้วยคำสั่ง kill แทนที่ pid ในคำสั่งด้านล่างด้วย PID ของกระบวนการหลัก:

kill -s SIGCHLD pid

เมื่อกระบวนการที่สร้างซอมบี้สิ้นสุดลง init จะทำหน้าที่สืบทอดกระบวนการซอมบี้และกลายเป็นพาเรนต์ใหม่ (init เป็นกระบวนการแรกที่เริ่มต้นบน Linux เมื่อบูตและกำหนด PID 1)

หมายเหตุ: -จากกระบวนการ Linux 3.4 เป็นต้นไปสามารถออกการเรียกระบบ prctl () ด้วยตัวเลือก PR_SET_CHILD_SUBREAPER และด้วยเหตุนี้กระบวนการเหล่านี้ไม่ใช่กระบวนการ # 1 จะกลายเป็นพาเรนต์ของกระบวนการสืบทอดที่สืบทอดกันมา อ้างอิง: /unix//a/177361/5132  

INIT จะดำเนินการเรียกใช้ระบบ wait () เพื่อล้างลูกซอมบี้ของมันดังนั้น init จะทำงานสั้น ๆ ของซอมบี้ คุณสามารถรีสตาร์ทกระบวนการหลักหลังจากปิดได้


มีโอกาสใดบ้างไหมที่การรอ () จะล้มเหลว?
Ravi

3
บนระบบ 64 บิตคุณสามารถเพิ่ม PID สูงสุดได้ที่unix.stackexchange.com/a/16884/170373
ilkkachu

1
ส่วนเกี่ยวกับการกลับใจใหม่ก็ผิดเช่นกัน unix.stackexchange.com/a/177361/5132 กระแทกแดกดันทำให้โปรแกรมย่อยเอกสารที่ไม่ได้คาดหวังว่าจะเป็นวิธีที่ง่ายที่จะทำให้เกิดกระบวนการซอมบี้ระยะยาว
JdeBP

2
ผู้ปกครองจะได้รับ SIGCHLD แล้วเมื่อกระบวนการที่ตอนนี้ซอมบี้เสียชีวิต
Ángel

2
การพูดอย่างเคร่งครัดมันไม่ถูกต้องที่จะบอกว่ามันใช้ทรัพยากรไม่ได้ มันยังคงใช้ PID (ซึ่งเป็นทรัพยากรที่ จำกัด ) และโครงสร้างข้อมูลเคอร์เนลสำหรับกระบวนการยังคงถูกจัดสรร โดยปกติแล้วสิ่งนี้จะไม่สำคัญมากนัก แต่การใช้หน่วยความจำเคอร์เนลอาจมีความสำคัญกับระบบที่มีหน่วยความจำ จำกัด มาก
Austin Hemmelgarn

6

ส่วนใหญ่ซอมบี้ไม่ใช่ปัญหาใหญ่ พวกเขาเป็นกระบวนการ 'dead'-ish ซึ่งไม่ต้องใช้เวลา CPU และหน่วยความจำที่จัดสรรใด ๆควรได้รับการปลดปล่อยโดยกระบวนการก่อนที่จะตาย ทรัพยากรเดียวที่พวกเขาใช้จริงคือรายการในรายการกระบวนการของคุณ ขึ้นอยู่กับระบบของคุณคุณสามารถมีจำนวนเธรดสูงสุดที่อนุญาตและการมีซอมบี้สามารถทำให้คุณถึงขีด จำกัด นี้เร็วขึ้นโดยไม่มีเหตุผล

อย่างไรก็ตาม: ซอมบี้มักจะปรากฏขึ้นเนื่องจากรหัสไม่ดี / buggy ซึ่งโปรแกรมเมอร์ลืมที่จะตรวจสอบสถานะของกระบวนการลูกของมัน นี่อาจเป็นการจงใจ แต่บ่อยครั้งที่มันไม่ใช่ รหัส Bad / buggy มักจะจัดการหน่วยความจำด้วยวิธีพิเศษที่ไม่ดี และไม่ปล่อยให้ทรัพยากรที่จัดสรรไว้ว่าง หากเป็นกรณีนี้ทรัพยากรเหล่านี้จะยังคงจัดสรรให้กับซอมบี้จนกว่าจะถูกยกเลิกอย่างสมบูรณ์

แก้ไข : หากกระบวนการเป็นโปรแกรมจาวาหน่วยความจำที่ไม่ได้ปลดปล่อยไม่ควรมีปัญหาเนื่องจากตัวรวบรวมขยะจาวาจะดูแลทุกอย่าง


3
ในความเป็นจริงไม่ใช่หน่วยความจำฟีดไม่ได้เป็นปัญหากับระบบปฏิบัติการส่วนใหญ่ในทุกภาษา ระบบจะเพิ่มหน่วยความจำทั้งหมดยกเว้นจำนวนเล็กน้อยสำหรับกระบวนการหลัก
วาลพูดว่า Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.