ฉันจะเลือก Apache MPM ที่ใช้ได้อย่างไร


261

นี่เป็นคำถามที่ยอมรับได้เกี่ยวกับการเลือก Apache httpd MPM ที่ถูกต้อง

ฉันสับสนเล็กน้อยระหว่าง MPM ที่แตกต่างกันที่เสนอโดย Apache - 'ผู้ปฏิบัติงาน', 'เหตุการณ์', 'prefork' ฯลฯ

อะไรคือความแตกต่างที่สำคัญระหว่างพวกเขาและฉันจะตัดสินใจได้อย่างไรว่าจะเลือกอันไหนดีที่สุดสำหรับการปรับใช้ที่กำหนด


4
หากคุณสนับสนุน mod_php แสดงว่าคุณทำ prefork แล้ว
Zoredache

6
@Zoredache: เธอไม่เคยพูดถึง PHP และแม้ว่าเธอจะ mod_php จะออกกฎเหตุการณ์เท่านั้น หรือคุณยังยึดติดกับคำพูดของ RL เมื่อ 8 ปีก่อน? ข้อผิดพลาดครั้งล่าสุดที่เข้าสู่ระบบใน PHP ที่เกี่ยวข้องกับ apache เธรดคือในปี 2005
symcbean

2
ขออภัย - ต้องโหวตให้ปิดนี้ - คำถามกว้างเกินกว่าจะตอบได้ที่นี่
symcbean

1
@symcbean Re: PHP และหัวข้อ - หลักของ PHP เป็น threadsafe วันนี้ แต่สิ่งอื่น ๆ อีกมากมายที่คุณจะพบว่าคนรวบรวมในไม่ได้ ฉันถูกกัดเมื่อเร็ว ๆ นี้เมื่อปีที่แล้วดังนั้นจึงเป็นอย่างมาก "การทดสอบ (อย่างกว้างขวาง) ก่อนที่จะพึ่งพามันในการผลิต" สถานการณ์ยัง ...
voretaq7

ขึ้นอยู่กับระบบปฏิบัติการที่คุณกำลังใช้คุณอาจไม่มีตัวเลือกเหล่านั้นทั้งหมดในการติดตั้งมาตรฐาน
John Gardeniers

คำตอบ:


415

มีจำนวนของมีโมดูล MPM (Multi-ประมวลผลโมดูล) แต่ไกลโดยส่วนใหญ่ใช้ (อย่างน้อยบนแพลตฟอร์มระวัง *) มีสามคนหลักอย่างแพร่หลายprefork, และworker eventโดยพื้นฐานแล้วมันแสดงถึงวิวัฒนาการของเว็บเซิร์ฟเวอร์ Apache และวิธีต่างๆที่เซิร์ฟเวอร์สร้างขึ้นเพื่อจัดการคำขอ HTTP ภายในข้อ จำกัด ด้านการคำนวณของเวลาในประวัติศาสตร์ (ในแง่ของซอฟต์แวร์) ที่ยาวนาน


prefork

mpm_prefork.. เป็นอย่างดี .. มันเข้ากันได้กับทุกสิ่ง มันหมุนออกจำนวนกระบวนการเด็กสำหรับการให้บริการตามคำขอและกระบวนการเด็กให้บริการเพียงหนึ่งการร้องขอในแต่ละครั้ง เนื่องจากมีกระบวนการเซิร์ฟเวอร์อยู่ที่นั่นพร้อมสำหรับการดำเนินการและไม่จำเป็นต้องจัดการกับเธรด marshaling จึงเร็วกว่า MPM เธรดที่ทันสมัยกว่าเมื่อคุณจัดการกับคำร้องขอครั้งเดียวเท่านั้น เนื่องจากพวกเขากำลังรอให้อยู่ในสายจนกว่ากระบวนการเซิร์ฟเวอร์จะให้บริการฟรี นอกจากนี้การพยายามเพิ่มจำนวนเด็กที่ทำกระบวนการ prefork คุณจะสามารถดูด RAM ที่ร้ายแรงบางตัวได้อย่างง่ายดาย

อาจไม่แนะนำให้ใช้ prefork จนกว่าคุณจะต้องการโมดูลที่ไม่ปลอดภัยสำหรับเธรด

ใช้ในกรณีที่:mod_phpคุณจำเป็นต้องมีโมดูลที่ทำลายเมื่อหัวข้อถูกนำมาใช้เช่น แล้วถึงแม้พิจารณาใช้ FastCGI php-fpmและ

อย่าใช้ถ้า:โมดูลของคุณจะไม่หยุดในการทำเกลียว

worker

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

ใช้ถ้า:คุณใช้ Apache 2.2 หรือ 2.4 และคุณใช้ SSL เป็นหลัก

อย่าใช้ถ้า:คุณไม่สามารถผิดพลาดได้เว้นแต่คุณจะต้องการ prefork เพื่อความเข้ากันได้

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

event

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

ข้อยกเว้นที่นี่คือการเชื่อมต่อ SSL; ในกรณีนั้นมันจะทำงานเหมือนกันกับคนงาน (ติดการเชื่อมต่อที่กำหนดไปยังเธรดที่กำหนดจนกว่าการเชื่อมต่อจะปิด)

ใช้ถ้า:คุณใช้ Apache 2.4 และชอบชุดข้อความ แต่คุณไม่ชอบให้มีชุดข้อความรอการเชื่อมต่อที่ไม่ได้ใช้งาน ทุกคนชอบกระทู้!

อย่าใช้ถ้า:คุณไม่ได้อยู่ใน Apache 2.4 หรือคุณต้องการ prefork เพื่อความเข้ากันได้


ในโลกปัจจุบันของslowloris , AJAX และเบราว์เซอร์ที่ต้องการเชื่อมต่อ TCP แบบมัลติเพล็กซ์ 6 (ด้วยการคงไว้ซึ่งความแน่นอน) ไปยังเซิร์ฟเวอร์ของคุณการทำงานพร้อมกันเป็นปัจจัยสำคัญในการทำให้เซิร์ฟเวอร์ของคุณขยายขนาด ประวัติของ Apache ได้ผูกมันไว้ในเรื่องนี้และในขณะที่มันยังไม่ถึงกับชอบของ nginx หรือ lighttpd ในแง่ของการใช้ทรัพยากรหรือขนาดมันชัดเจนว่าทีมพัฒนากำลังทำงานเพื่อสร้างเว็บเซิร์ฟเวอร์ที่เกี่ยวข้อง ในโลกที่มีคำขอพร้อมกันสูงในทุกวันนี้


3
-1: IME ผู้ปฏิบัติงานลดขนาดของ httpd footprint โดยเฉพาะในพื้นที่ 15% (IIRC Linux รายงาน COW ใน RSS ซึ่งทำให้มองล่วงหน้าก่อนราวกับว่าใช้หน่วยความจำมากกว่าที่เป็น) มีความแตกต่างเล็กน้อยระหว่างรอยเท้าเคอร์เนลสำหรับกระบวนการและเธรด NPTL มันอยู่ไกลจากโลกที่แตกสลาย ฉันไม่เข้าใจว่าทำไมคุณคิดว่าการรอและการจัดสรรเธรดมีประสิทธิภาพมากขึ้นในการกำหนดเงื่อนไขมากกว่ารอให้ / การจัดกำหนดการกระบวนการ (เตรียมไว้ล่วงหน้า) หรือสิ่งที่คุณคิดว่า SSL นั้นมีอยู่จริง
symcbean

9
@symcbean ดังนั้นคุณกำลังบอกว่าการใช้ RAM 15% ไม่สำคัญหรือ? ไม่เป็นไร แต่ความเห็นของฉันจะเป็นอย่างอื่น การเรียกร้องประสิทธิภาพการทำงานพร้อมกันไม่ใช่ของฉันเอง ดูที่นี่ และความแตกต่างของ SSL นั้นถูกอธิบายอย่างชัดเจนในเอกสารประกอบสำหรับเหตุการณ์ MPM:The improved connection handling does not yet work for certain connection filters, in particular SSL. For SSL connections, this MPM will fall back to the behaviour of the worker MPM and reserve one worker thread per connection.
Shane Madden

3
@ShaneMadden `และในขณะที่มันยังไม่ถึงกับชอบ nginx หรือ lighttpd ในแง่ของการใช้ทรัพยากรหรือขนาด 'ฉันมี apache floor ทั้งสองระบบ
Kelly Elton

@ShaneMadden เกี่ยวกับปัญหากับ SSL และเหตุการณ์ MPM: คุณรู้หรือไม่ว่า nginx จัดการสิ่งนี้ได้ดีกว่า apache หรือไม่?
DASKAjA

ดูเหมือนว่าถ้าคุณรวบรวม apache 2.4 โดยไม่ทราบเกี่ยวกับโมดูล mpm มันมาพร้อมกับโมดูลที่ชื่อ event mpm module และทำงานกับ mod_php7 (ตอนนี้ฉันกำลังค้นคว้า mpm เพราะ apache2.4 นั้นเกินขีด จำกัด การเชื่อมต่อ mysql ในขณะที่ apache 2.2 กับ mysql เซิร์ฟเวอร์เดียวกัน ไม่)
BioHazard

8

นี่คือคำอธิบายที่ดีเกี่ยวกับวิธีการทำงานกับ gif:

https://www.datadoghq.com/blog/monitoring-apache-web-server-performance/

สั้น ๆ : หากคุณใช้2.4และคุณต้องการ httpd เป็นพร็อกซีย้อนกลับ (โปรแกรมเลือกจ่ายงาน) ดังนั้นตัวเลือกของคุณคือMPM ของเหตุการณ์


แม้ว่าเราจะใช้ SSL? ฉันใช้ apache เป็นพร็อกซีและเปิดใช้ SSL SSL บนเว็บไซต์ที่ไม่ใช่ SSL
bokan

@bokan ดูเหมือนว่าใช่นี่เป็นสิ่งที่ดีที่สุด แต่อย่างไรก็ตาม proxying นั้น จำกัด สำหรับ SSL
Yura

ว้าว ~ โพสต์บล็อกนั้นดีกว่าคำตอบที่ยอมรับและ gif นั้นยอดเยี่ยมมาก! Thankssss คุณบันทึกวันของฉัน
Rick

6

ตั้งแต่เดือนกุมภาพันธ์ 2018 เอกสาร Apache 2.4 สำหรับ Event MPM ระบุว่าการใช้ Apache เป็นพร็อกซีจะทำให้ "การจัดการการเชื่อมต่อที่ดีขึ้น" ตั้งแต่ 2.4.24 ไม่สามารถทำงานได้ตามที่ออกแบบไว้ ดูหัวข้อข้อ จำกัด

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

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


5

ส่วนใหญ่ขึ้นอยู่กับโมดูล Apache ที่คุณต้องการใช้ ฉันคิดว่าคนงานมักเป็นตัวเลือกเริ่มต้น แต่บางโมดูล (เก่ากว่า) ต้องการการฟอร์กและขึ้นอยู่กับ prefork

หากคุณไม่มีการตั้งค่าฉันขอแนะนำให้คุณไปกับการพึ่งพาที่ต้องการจากการกระจายระบบปฏิบัติการของคุณ ตัวอย่างเช่น Ubuntu โดยค่าเริ่มต้นจะติดตั้ง mpm-worker เมื่อคุณติดตั้ง Apache2

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