ทำไมคุณถึงตั้งค่า MaxKeepAliveRequests เป็นอะไรก็ได้ แต่ไม่ จำกัด


11

Apache KeepAliveTimeoutมีอยู่เพื่อปิดการเชื่อมต่อแบบ keep-alive หากไม่มีการออกคำขอใหม่ภายในระยะเวลาที่กำหนด หากผู้ใช้ไม่ปิดเบราว์เซอร์ / แท็บการหมดเวลานี้ (ปกติ 5-15 วินาที) เป็นสิ่งที่ปิดการเชื่อมต่อแบบ keep-alive ส่วนใหญ่ในที่สุดและป้องกันไม่ให้ทรัพยากรเซิร์ฟเวอร์สูญเปล่าโดยการหยุดการเชื่อมต่ออย่างไม่มีกำหนด

ตอนนี้MaxKeepAliveRequestsคำสั่งจะ จำกัด จำนวนการร้องขอ HTTP ที่การเชื่อมต่อ TCP เดียว (เปิดค้างไว้เนื่องจากKeepAlive) จะให้บริการ การตั้งค่านี้0หมายถึงอนุญาตจำนวนคำขอได้ไม่ จำกัด

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

วิธีที่ฉันเห็นมันไม่มีประเด็นที่จะ จำกัด เรื่องนี้ ฉันกำลังคิดถึงอะไร

คำตอบ:


4

โดยพื้นฐานแล้วเนื่องจาก Apache ไม่ได้สร้างขึ้นเพื่อมัน ปัญหาคือการใช้หน่วยความจำเซิร์ฟเวอร์ ในการกำหนดค่าจำนวนมากการสร้างเนื้อหาจะดำเนินการในกระบวนการเดียวกับการจัดส่งเนื้อหาดังนั้นแต่ละกระบวนการจะเพิ่มขนาดของสิ่งที่ใหญ่ที่สุดที่จัดการ รูปภาพโปรเซสที่ขยายเป็น 64mb เนื่องจากสคริปต์ php หนักจากนั้นกระบวนการที่ป่องจะนั่งและให้บริการไฟล์คงที่ ตอนนี้คูณด้วย 100 นอกจากนี้หากมีหน่วยความจำรั่วที่ใดก็ตามกระบวนการจะเติบโตโดยไม่ จำกัด

การตั้งค่าแบบ keepalive ควรมีความสมดุลตามประเภทของเนื้อหาและปริมาณการใช้งานของคุณ โดยทั่วไปการกำหนดค่าที่เหมาะสมที่สุดคือ MaxKeepAliveRequests สูง (100-500) และ KeepAliveTimeout ต่ำ (2-5) เพื่อให้ว่างได้เร็วขึ้น


2

ฉันรู้ว่านี้เป็นคำถามที่เก่า แต่ผมได้ทำแก้จุดบกพร่องบางอย่างและดูเหมือนว่า (และนี่ไม่ได้เป็นเพียงความจริงสำหรับ Apache) ทำงานเป็นอิสระจากMaxKeepAliveRequestsKeepAliveTimeout

ความหมายไทม์เอาต์สั่งจะนับเฉพาะกับการเชื่อมต่อถาวรที่ไม่ทำงาน (ไม่มีการอ่านหรือเขียน) - ถ้าคุณให้การร้องขอด้านล่างหมดเวลาที่คุณสามารถทำได้ไม่ จำกัด จำนวนคำขอผ่านการเชื่อมต่อเดียวกัน

สิ่งนี้อาจไม่ดีด้วยเหตุผลบางประการรวมถึงการเชื่อมต่อ tcp ที่ใช้เวลานานซึ่งถูกสุ่มฆ่า? ไม่ว่าในกรณีใดไคลเอนต์ http นั้นไม่งี่เง่าและสามารถจัดการการMaxKeepAliveRequestsตั้งค่า"ต่ำ" ได้ค่อนข้างดีเช่นมันค่อนข้างง่ายในการเขียนโปรแกรมภาษาเพื่อตรวจสอบว่าการเชื่อมต่อ tcp ถูกปิดโดยเซิร์ฟเวอร์และทำการเชื่อมต่ออีกครั้ง นอกจากนี้ไคลเอ็นต์ http ส่วนใหญ่จะมีข้อ จำกัด ในตัวเอง (เช่นเบราว์เซอร์จะปิดการเชื่อมต่อแบบ keep-alive หลังจาก 300 วินาทีหรือมากกว่านั้น)


1

เหตุผลหนึ่งที่ทำให้สมดุลภาระ เมื่อทำการเชื่อมต่อแบบ keep-alive หรือ http 1.1 แบบต่อเนื่องตัวโหลดบาลานซ์จะไม่ย้ายไปยังโฮสต์ใหม่จนกว่าจะปิด หากคุณมีลูกค้ารายหนึ่งที่ร้องขอจำนวนมากผ่านการเชื่อมต่อเดียวคุณอาจไม่ได้รับความสมดุลระหว่างเซิร์ฟเวอร์ที่ดี


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

1
จุดที่ดี ความคิดเล็ก ๆ น้อย ๆ : 1. คนอื่น ๆ บนเซิร์ฟเวอร์นั้นจะได้รับผลกระทบเช่นกัน 2. สำหรับตัวโหลดบาลานซ์ที่ทำงานต่ำกว่าระดับ HTTP: เมื่อคุณนำเซิร์ฟเวอร์ออกจากพูลโหลดบาลานซ์มันจะไม่ปิดการเชื่อมต่อ HTTP ที่มีอยู่ ทำให้การย้ายผู้คนไปยังเซิร์ฟเวอร์ที่แตกต่างกันมีความยุ่งยากมากขึ้น เหตุผลที่ 2 คือฉันมาที่หน้านี้ในขณะที่ค้นหาเพื่อดูว่าผู้คนพูดถึงพารามิเตอร์นี้อย่างไร
dtauzell

1
เหตุผลข้อที่สาม: หากเซิร์ฟเวอร์ / แอปของคุณอยู่ในสถานะไม่ดีและเกิดข้อผิดพลาดในการปักหมุดนี้จะทำให้ข้อผิดพลาดการร้องขอทั้งหมดหมดลงจนกว่าสถานการณ์จะได้รับการแก้ไขในขณะที่ถ้าคุณ จำกัด จำนวนพวกเขามีโอกาสสมดุลกับเซิร์ฟเวอร์ใหม่ .
dtauzell

ฉันยังไม่เจอโหลดบาลานเซอร์ที่ใช้งานได้เช่นนี้ โหลดบาลานเซอร์มักจะมีพารามิเตอร์ "stickiness" ที่กำหนดว่าคำขอทั้งหมดของไคลเอ็นต์ (กำหนดโดย IP ตัวอย่าง) ภายในเซสชันปัจจุบันควรกำหนดเส้นทางไปยังอัปสตรีมเดียวกันหรือแพร่กระจายท่ามกลางสตรีมมิ่งตัวเลือกใดมีประโยชน์ขึ้นอยู่กับแอพที่ ทำงานบน upstreams
Manuel

1

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

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

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