ฉันควรเปิดใช้งาน KeepAlive ใน Apache2 หรือไม่


25

ในการติดตั้งเริ่มต้นใด ๆ Apache 2 มาพร้อมกับ keepAlive แต่เมื่อดูที่เซิร์ฟเวอร์อื่นโมดูล keepAlive ก็เปิดอยู่

ดังนั้นฉันจะรู้ได้อย่างไรว่า keepAlive นั้นเหมาะกับฉันหรือไม่ ฉันจะหาตัวอย่างที่ดีเกี่ยวกับการกำหนดค่านี้ได้จากที่ใด

คำตอบ:


31

มีคำตอบที่ดีอยู่แล้ว 2 ข้อ แต่ปัญหาในชีวิตจริงที่สำคัญที่สุดอาจยังไม่ได้กล่าวถึง

ก่อนอื่น OP อาจต้องการอ่านคำตอบก่อนหน้านี้ 2 คำตอบและโพสต์บล็อกเล็ก ๆ นี้เพื่อทำความเข้าใจว่า keepalives คืออะไร (ผู้เขียนไม่ได้อธิบายอย่างละเอียดในส่วนเกี่ยวกับ TCPI / IP ที่ได้รับ "เร็ว" ยิ่งการเชื่อมต่อเปิดนานขึ้นจริง ๆ แล้วการเชื่อมต่อที่ยาวนานยิ่งขึ้นได้รับประโยชน์จากการปรับขนาดหน้าต่าง IPแต่เอฟเฟกต์จะไม่สำคัญ ขนาดใหญ่หรือผลิตภัณฑ์ที่มีความล่าช้าแบนด์วิดธ์มีขนาดใหญ่ผิดปกติ)

อาร์กิวเมนต์ที่สำคัญต่อ HTTP Keepalive เมื่อใช้ Apacheคือมันบล็อกกระบวนการของ Apache เช่นลูกค้าที่ใช้ Keepalives จะป้องกันไม่ให้กระบวนการ Apache ของเขา 'บริการลูกค้าอื่น ๆ จนกว่าลูกค้าจะปิดการเชื่อมต่อหรือหมดเวลาที่จะถึง ในช่วงเวลาเดียวกันอินสแตนซ์ Apache นี้อาจให้บริการการเชื่อมต่ออื่น ๆ อีกมากมาย

ตอนนี้การกำหนดค่า Apache ที่ใช้กันทั่วไปคือPrefork MPMและล่าม PHP / Perl / Python และรหัสแอปพลิเคชันในภาษาที่กล่าวถึง ในกรณีนี้แต่ละกระบวนการ Apache จะ "หนัก" ในแง่ที่ว่ามันใช้ RAM หลายเมกะไบต์ (Apache เชื่อมโยงกับล่ามและรหัสแอปพลิเคชัน) สิ่งนี้รวมถึงการปิดกั้นอินสแตนซ์ Apache แต่ละอันที่ไม่มีประสิทธิภาพ

วิธีแก้ปัญหาทั่วไปคือการใช้เซิร์ฟเวอร์ Apache 2 เครื่อง (ทั้งบนเซิร์ฟเวอร์จริงเดียวกันหรือบนเซิร์ฟเวอร์ 2 เครื่องตามต้องการ) ด้วยการกำหนดค่าที่แตกต่างกัน:

  • หนึ่ง "หนัก" กับ mod_php (หรือสิ่งที่เขียนโปรแกรมภาษาที่ใช้) สำหรับเนื้อหาแบบไดนามิกที่มีkeepalives ปิด
  • หนึ่ง "เบา" กับชุดที่น้อยที่สุดของโมดูลสำหรับการให้บริการเนื้อหาแบบคงที่ (ภาพ, CSS, js ฯลฯ ) กับkeepalives บน

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

  • ใช้เซิร์ฟเวอร์เหตุการณ์ที่ขับเคลื่อนด้วยสำหรับเนื้อหาคงที่เช่นNginx
  • ใช้ CDN สำหรับเนื้อหาแบบคงที่ (สามารถให้บริการเนื้อหาแบบคงที่ทั้งหมดสำหรับคุณ)
  • การใช้แคชเนื้อหาแบบคงที่และ / หรือแบบไดนามิก

วิธีการเกี่ยวกับอีกเพื่อหลีกเลี่ยงการปิดกั้น Apacheคือการใช้ balancer โหลดกับการจัดการการเชื่อมต่ออย่างชาญฉลาดเช่นPerlbal

.. และอีกมากมาย :-)


2
คำตอบเหล่านี้ยังคงมีความเกี่ยวข้องในอีก 8 ปีหรือไม่
TheStoryCoder

ใช่ยังมีความเกี่ยวข้องหากคุณใช้ MPM prefork โปรดทราบว่า Apache httpd 2.4 (เช่นใน RHEL7) ใช้ KeepAlive On ตามค่าเริ่มต้น (แต่ไม่ได้แสดงรายการไว้ในการกำหนดค่าอย่างชัดเจน - อย่างน้อยใน RHEL7)
คาเมรอนเคอร์

5

Keepalives อาจดีในบางกรณีพวกเขาอาจไม่ดีในผู้อื่น พวกเขาลดเวลาและความพยายามในการตั้งค่าการเชื่อมต่อใหม่ แต่พวกเขาผูกทรัพยากรเซิร์ฟเวอร์สำหรับระยะเวลาของการหมดเวลาแบบ keepalive ตัวอย่าง:

  • หน้าเว็บที่มีวัตถุขนาดเล็กจำนวนมากลูกค้าที่ใช้งาน dialup - keepalive ควรเปิดใช้งาน
  • หน้าที่มีออบเจ็กต์ขนาดใหญ่ไม่กี่อัน - Keepalive จะไม่พิจารณาเป็นพิเศษ
  • เซิร์ฟเวอร์ที่มีจำนวนผู้เข้าชมที่ไม่ซ้ำสูงมาก - keepalive ควรปิด (ไม่เช่นนั้นซ็อกเก็ตและเธรดจะอยู่ในหน่วยความจำที่รอการหมดเวลาแบบ keepalive และไม่ให้บริการลูกค้าใหม่)

อย่างที่คุณเห็น KeepAliveTimeout จะมีบทบาทสำคัญในการเพิ่มประสิทธิภาพของเซิร์ฟเวอร์ของคุณ

ดูรูปแบบการใช้งานและตัดสินใจด้วยตัวเอง


0

คุณควรใช้ KeepAlive On

ดู:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

ด้วยวิธีนี้เบราว์เซอร์จะใช้การเชื่อมต่อ TCP เดี่ยวอีกครั้งเพื่อส่งแบบสอบถามจำนวนมาก โดยปกติเว็บไซต์จะมีองค์ประกอบหลายอย่าง (หน้า HTML, รหัส JavaScript, รูปภาพ) ตราบใดที่ทรัพยากรเหล่านี้อยู่ในโดเมนเดียวกันดังนั้นจึงสามารถให้บริการโดยเซิร์ฟเวอร์เดียวกันการเชื่อมต่อ KeepAlive ให้ประสิทธิภาพที่เพิ่มขึ้นอย่างมหาศาลเนื่องจากเบราว์เซอร์ไม่จำเป็นต้องสร้างการเชื่อมต่อ TCP ใหม่

เบราว์เซอร์โดยทั่วไปจะเปิดการเชื่อมต่อแบบขนานประมาณ 3 โดเมน สมมุติว่าคุณมี 18 วัตถุในเว็บไซต์ของคุณ เบราว์เซอร์จะเปิดการเชื่อมต่อ 3 ครั้งและจะดาวน์โหลด 6 วัตถุในแต่ละการเชื่อมต่อโดยใช้โหมด KeepAlive หากไม่มี KeepAlive จะต้องเปิดการเชื่อมต่อ 18 TCP ซึ่งช้ามาก

เบราว์เซอร์ที่ทันสมัยส่วนใหญ่หรือทั้งหมดนั้นเป็นไปตามมาตรฐาน HTTP / 1.1 ดังนั้นจึงควรใช้งานได้

พร็อกซี HTTP บางอย่างเช่น Squid ไม่สอดคล้องกับ HTTP / 1.1 แต่พวกเขาร้องขอให้ใช้การเชื่อมต่อ KeepAlive


นี่เป็นเพียงการพิจารณาจากฝั่งไคลเอ็นต์ในขณะที่ฉันคิดว่าการใช้ทรัพยากรฝั่งเซิร์ฟเวอร์ก็มีความสำคัญเช่นกัน
มอร์แกนเฉิง

การใช้ทรัพยากรด้านเซิร์ฟเวอร์มีความสำคัญมากกว่าเวลาแฝงที่ผู้ใช้รับรู้?
Yves Junqueira

1
ฉันยังเชื่อในการเปิดใช้ KeepAlive On แต่การหมดเวลาเริ่มต้นของ Apache ในเวลา 15 วินาทีนั้นใจกว้างเกินไปเพราะมันทำให้กระบวนการถูกบล็อกไว้นานเกินไป ฉันมักจะตั้งค่าการหมดเวลาประมาณ 2 วินาทีซึ่งส่งผลให้ KeepAlive ถูกใช้ในระหว่างประมาณหนึ่ง pageload
Martijn Heemels
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.