ติดตั้งตัวใด: Apache Worker หรือ Prefork อะไรคือข้อดีของแต่ละข้อ?


55

จากคำอธิบายของทั้งPreforkและWorker MPM ดูเหมือนว่าประเภท prefork ค่อนข้างล้าสมัย แต่ฉันไม่พบการเปรียบเทียบที่เหมาะสมของทั้งสองประเภท

สิ่งที่ฉันอยากรู้:

  • อะไรคือความแตกต่างระหว่างสองเวอร์ชันนี้?
  • อะไรคือข้อดี (dis-) ของเซิร์ฟเวอร์แต่ละประเภท?
  • มีแนวทางพื้นฐานใดบ้างที่จะเลือกประเภทตามเงื่อนไข
  • มีความแตกต่างด้านประสิทธิภาพที่ใหญ่ระหว่างสองหรือไม่

คำตอบ:


40

ตามที่เอกสารระบุไว้คุณควรใช้ MPM prefork ถ้าคุณต้องการหลีกเลี่ยงการทำเกลียวเพื่อให้เข้ากันได้กับไลบรารีที่ไม่ปลอดภัย โดยทั่วไปแล้วโมดูล Apache ใด ๆ ที่ไม่สำคัญ ( mod_php- หรืออย่างแม่นยำยิ่งขึ้นส่วนขยายและไลบรารีจำนวนมากที่ลิงก์ไปยัง - เป็นตัวอย่างที่ยอมรับได้) มีไลบรารีที่ไม่ปลอดภัยสำหรับเธรด (หรือมี non-thread-) รหัสปลอดภัยในมัน) ดังนั้นถ้าคุณไม่ได้ใช้งาน Apache ติดตั้งสวย ๆ ฉันก็จะใช้ MPM prefork


3
ฉันจะแนะนำ MPM ของผู้ปฏิบัติงานเว้นแต่คุณจะใช้งาน PHP คนทำงานคือ MPM ที่แนะนำจาก apache และให้ประสิทธิภาพที่ดีขึ้นและค่าใช้จ่ายต่ำ มีเพียงผู้พัฒนา PHP เท่านั้นที่ไม่เคยได้ยินเรื่องความปลอดภัยของเธรดที่คุณต้องใช้ prefork
David Pashley

16
PHP มีเธรดที่ปลอดภัยมาเป็นเวลานาน พวกเขาแนะนำให้ใช้ pre-forkers เท่านั้นเนื่องจากไม่สามารถควบคุมสิ่งที่ไลบรารีอื่นทำ ออกจากการตำหนิ PHP สำหรับการไม่โต้ตอบของนักพัฒนาคนอื่น
Alister Bulman

3
PHP อาจเป็นเธรดที่ปลอดภัย (แม้ว่าฉันสงสัย) แต่ไลบรารีทั้งหมดที่ลิงก์ไปยังไม่แน่นอน ที่นี่เรารันแอปพลิเคชั่น PHP ขนาดใหญ่พอสมควรและทุกสองสามเดือนเราพยายามเปลี่ยนจาก prefork เป็นคนทำงาน แต่เราได้รับข้อมูลที่เสียหายทันที
Aleksandar Ivanisevic

5
อย่างน้อยการเปลี่ยนฟังก์ชั่นตัวแปร ENV จะไม่ปลอดภัยสำหรับเธรด setlocal php.net/manual/en/function.setlocale.phpเป็นตัวอย่างที่ดีของมัน
รัศมี

4
One note: ปัญหาเหล่านี้ใช้ไม่ได้ถ้าติดกับ PHP เช่นกับphp-fpmทาง FastCGI จากนั้น MPM ของผู้ปฏิบัติงานก็ใช้ได้ - จากนั้น fpm จะเรียกใช้ทุกคำขอ PHP ในกระบวนการของตัวเองในขณะที่ Apache สามารถเรียกใช้เธรด ปัญหาความปลอดภัย PHP-Thread- ป้องกันไม่ให้คุณใช้งานmod_php, ซึ่งรัน PHP ภายในกระบวนการ Apache
mschuett

13

โซลูชันแบบคลาสสิกสำหรับการเรียกใช้ส่วนขยายที่ไม่ปลอดภัยในขณะที่ให้บริการจำนวนมาก (> 100) ของการเชื่อมต่อพร้อมกันคือการเรียกใช้ PHP บน fastCGI (mod_fcgid โมดูล apache เนทีฟ) และคำขอไดนามิกพรอกซีพร็อกซี่

สิ่งนี้จะช่วยให้คุณสามารถปรับขนาดจากการเชื่อมต่อพร้อมกันมากกว่าสองร้อยถึง 1,000 การเชื่อมต่อพร้อมกับหน่วยความจำขนาดเล็ก (4 ~ 8GB) เมื่อแสดงเนื้อหาแบบคงที่และแบบไดนามิก

แน่นอนคุณควรตรวจสอบโซลูชันแคช front-end เป็นส่วนหนึ่งของการปรับใช้โดยรวมของคุณ (memcached, varnish)

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


คุณสามารถขยายความคิดเห็นในเหตุการณ์ mpm ได้หรือไม่ มันจะสแต็คเทียบกับ mpm-workers ได้อย่างไร?
Sirex

ในขณะที่ MPM ของผู้ปฏิบัติงานทำงานบนเธรดอยู่แล้วและดังนั้นจึงเร็วกว่าที่จะเริ่มต้นและเบาลงเพื่อให้ทำงานได้เหตุการณ์ MPM ไม่ได้สำรวจซ็อกเก็ตอีกต่อไป - มันจะได้รับแจ้งเกี่ยวกับกิจกรรม ดังนั้น "เหตุการณ์"
adaptr

ดังนั้นควรทำงานได้ดีกว่าในไซต์ที่มีการเข้าชมสูง (13k / วินาที)
Sirex

6

เป็นเวลาประมาณ 3 ปีแล้วที่คำถามถูกโพสต์ แต่ฉันอยากจะแนะนำให้คุณไปกับ MPM ของผู้ปฏิบัติงานแทนการใช้งานล่วงหน้าแม้ว่าจะใช้ PHP เพื่อให้ได้ประสิทธิภาพที่ดีขึ้น

สำหรับความแตกต่าง pre-fork จะไม่มีเธรดดังนั้นเซิร์ฟเวอร์จะดำเนินการกระบวนการสำหรับการร้องขอของไคลเอ็นต์แต่ละรายการ (ซึ่งจะมีการคาดการณ์ล่วงหน้าของการร้องขอใหม่เพื่อให้การฟอร์กไม่กินลงในเวลาตอบสนอง) เนื่องจากคำขอเป็นเซิร์ฟเวอร์ในกระบวนการที่แยกต่างหากซึ่งมักจะเก็บภาษีหน่วยความจำและ CPU ของคุณมากกว่า พนักงานนำหลายเธรดซึ่งเบากว่าและมีการใช้หน่วยความจำดีขึ้น


2

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


คุณไม่สามารถ "สลับออก" MPM ใน apache 2.2 โดยพลการ มันถูกตั้งค่าในเวลารวบรวม
adaptr

คุณสามารถทำได้ด้วย apt หรือ RPMs Debian มีแพ็คเกจ Apache 2 หลายแบบขึ้นอยู่กับสไตล์ที่คุณต้องการ
เบรนแดนเบิร์ด

1

ที่ต้องการประเภทและประเภทของการรับส่งข้อมูลที่คุณจะมี และก่อนอื่นคุณต้องเข้าใจความแตกต่างที่สำคัญระหว่าง prefork และคนงาน หวังว่าบทความด้านล่างจะช่วยคุณคิดออก! http://slashroot.in/how-is-nginx-different-from-apache


2
เราต้องการคำตอบที่จะมีเนื้อหาไม่ใช่ลิงก์ไปยังเนื้อหา หากคุณสามารถให้ข้อมูลสรุปเกี่ยวกับสิ่งที่อยู่ในลิงค์เป้าหมายนั่นคือแนวทางปฏิบัติที่ดีที่สุด Link-rot เกิดขึ้น
sysadmin1138

1
คำถามเกี่ยวกับ Apache (nginx ไม่ใช่ apache) และข้อดีที่สัมพันธ์กันของ prefork หรือเธรด (nginx ไม่ใช้)
symcbean
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.