เมื่อคุณใช้ผู้ปฏิบัติงาน MPM คำขอจะได้รับการจัดการโดยเธรดที่มีอยู่ในกระบวนการ
จาก https://httpd.apache.org/docs/2.4/mod/worker.html
กระบวนการควบคุมเดียว (พาเรนต์) มีหน้าที่รับผิดชอบในการเรียกใช้กระบวนการย่อย กระบวนการลูกแต่ละกระบวนการจะสร้างเธรดเซิร์ฟเวอร์ในจำนวนคงที่ตามที่ระบุในคำสั่ง ThreadsPerChild เช่นเดียวกับเธรดตัวฟังที่รับฟังการเชื่อมต่อและส่งต่อไปยังเธรดเซิร์ฟเวอร์เพื่อประมวลผลเมื่อมาถึง
บน Linux กระบวนการ 'มี' เธรด นั่นคือ PID หนึ่งสามารถมีได้หลายเธรดซึ่งใช้หน่วยความจำร่วมกัน (ท่ามกลางทรัพยากรอื่นๆ) กับเธรดอื่นๆ ใน PID นั้น
ตามความเป็นจริงแล้ว Linux สนใจเฉพาะ 'งาน' เท่านั้น กระบวนการที่ไม่ใช่มัลติเธรดคือ PID ที่มีคอนเทนเนอร์ หนึ่ง งาน.
เมื่อคุณโหลด Apache ใหม่อย่างนุ่มนวล แสดงว่าคุณกำลังยุติกระบวนการที่มีอยู่
สิ่งที่เกิดขึ้นที่นี่คือ Apache ทำให้แต่ละเธรดรอจนกว่าเธรดทั้งหมดในกระบวนการบรรจุจะเสร็จสิ้นก่อนที่จะรีสตาร์ทคอนเทนเนอร์ PID
ดังนั้น ในกรณีของคุณ คุณมีเธรดเดียวที่อยู่ในกระบวนการทั้งหมดในรายการนั้นซึ่งยังไม่ว่างหรือติดค้างอยู่
คุณมีตัวเลือกไม่กี่อย่าง
- เพียงแค่เลิกรอแล้วเริ่มต้นใหม่
- ค้นหาเธรดปัญหา (อาจเป็นข้อผิดพลาดในแอปพลิเคชัน) และแก้ไข
1 เป็นเรื่องง่าย เพิ่มตัวเลือกการกำหนดค่า สง่างามShutdownTimeout
ด้วยมูลค่าที่สูงแต่ไม่โง่ พูด 900 วินาที ตามค่าดีฟอลต์ ค่านี้จะไม่มีที่สิ้นสุด ซึ่งหมายความว่าเธรดของคุณรอตลอดไปเพื่อให้เธรดปัญหาของคุณเสร็จสิ้น
ข้อเสียเปรียบหลักคือคุณมีโอกาสชนกับกระบวนการระหว่างทำสิ่งที่สำคัญ ซึ่งการยกเลิกอาจทำให้ไฟล์เสียหายหรือทำให้แอปพลิเคชันเสียหายได้
คุณยังเรียกใช้โอกาส (น้อยมาก) ในการยกเลิกไคลเอนต์ระหว่างการประมวลผล
2 คุณจะต้องค้นหาเธรดที่ติดอยู่ในรายชื่อคนงาน จากนั้นวินิจฉัยว่าการเชื่อมต่อกำลังทำอะไรอยู่ แต่คุณจะต้องค้นหาสิ่งที่อาจเป็นข้อบกพร่องของการออกแบบ และคุณสามารถอธิบายพฤติกรรมดังกล่าวได้อย่างมั่นใจมากขึ้นก่อนที่จะเป่า ออกจากกระทู้ปัญหา