เคล็ดลับในการเพิ่มคำขอ Nginx ให้ได้มากที่สุด / วินาที?


15

ฉันกำลังสร้างแพคเกจการวิเคราะห์และข้อกำหนดของโครงการระบุว่าฉันต้องการการสนับสนุน 1 พันล้านครั้งต่อวัน ใช่ "พันล้าน" กล่าวอีกนัยหนึ่งคือไม่น้อยกว่า 12,000 ครั้งต่อวินาทีที่ยั่งยืนและโดยเฉพาะอย่างยิ่งบางห้องที่จะระเบิด ฉันรู้ว่าฉันจะต้องใช้เซิร์ฟเวอร์หลายเครื่องสำหรับเรื่องนี้ แต่ฉันพยายามที่จะเพิ่มประสิทธิภาพสูงสุดของแต่ละโหนดก่อนที่จะ "ทิ้งฮาร์ดแวร์เพิ่มเติม"

ตอนนี้ฉันมีส่วนติดตามที่สำเร็จแล้วและได้รับการปรับปรุงให้ดีที่สุด ฉันสวยมากเพียงแค่บันทึกคำขอลงใน Redis (สำหรับการประมวลผลในภายหลังด้วย Hadoop) แอปพลิเคชั่นนี้คือ Python / Django ที่มี gunicorn สำหรับเกตเวย์

เซิร์ฟเวอร์ 2GB Ubuntu 10.04 Rackspace ของฉัน (ไม่ใช่เครื่องที่ใช้งานจริง) สามารถให้บริการไฟล์คงที่ประมาณ 1200 ไฟล์ต่อวินาที (ทำการเปรียบเทียบโดยใช้ Apache AB กับสินทรัพย์คงที่เดียว) ในการเปรียบเทียบหากฉันสลับลิงก์ไฟล์คงที่กับลิงก์ติดตามของฉันฉันยังได้รับประมาณ 600 คำขอต่อวินาที - ฉันคิดว่านี่หมายความว่าตัวติดตามของฉันได้รับการปรับให้เหมาะสมเพราะมันเป็นเพียงปัจจัย 2 ช้ากว่าการแสดงเนื้อหาแบบคงที่เดียวกัน ซ้ำแล้วซ้ำเล่า

อย่างไรก็ตามเมื่อฉันเปรียบเทียบกับความนิยมหลายล้านครั้งฉันสังเกตเห็นบางสิ่ง -

  1. ไม่มีการใช้ดิสก์ - คาดว่าเป็นเพราะฉันได้ปิดบันทึก Nginx ทั้งหมดและรหัสที่กำหนดเองของฉันไม่ได้ทำอะไรนอกจากบันทึกรายละเอียดคำขอลงใน Redis
  2. การใช้งานหน่วยความจำไม่คงที่ - น่าจะเป็นเพราะการจัดการหน่วยความจำของ Redis การใช้งานหน่วยความจำของฉันจะค่อยๆปีนขึ้นและจากนั้นเลื่อนถอยหลัง แต่มันไม่เคยเป็นคอขวดของฉันเลย
  3. โหลดของระบบวนเวียนอยู่ประมาณ 2-4 ระบบยังคงตอบสนองได้แม้กระทั่งมาตรฐานที่หนักที่สุดของฉันและฉันยังสามารถดูhttp://mysite.com/tracking/pixelด้วยตนเองด้วยความล่าช้าเล็กน้อยที่มองเห็นได้ในขณะที่เซิร์ฟเวอร์ (อื่น ๆ ) ของฉันทำงาน 600 คำขอต่อ ที่สอง
  4. หากฉันทำการทดสอบสั้น ๆ ว่า 50,000 ครั้ง (ใช้เวลาประมาณ 2 นาที) ฉันจะได้รับการร้องขอที่มั่นคงและเชื่อถือได้ 600 ต่อวินาที ถ้าฉันใช้การทดสอบที่นานขึ้น (พยายามจนถึง 3.5m จนถึงตอนนี้) r / s ของฉันจะลดลงเหลือ 250

คำถามของฉัน -

ดูเหมือนว่าฉันกำลังขยายเซิร์ฟเวอร์นี้หรือไม่ ไฟล์สแตติก 1,200 / s มีประสิทธิภาพ nginx เปรียบได้กับสิ่งที่คนอื่นเคยมีประสบการณ์?

ข มีการปรับค่า nginx ทั่วไปสำหรับแอปพลิเคชั่นที่มีปริมาณสูงเช่นนั้นหรือไม่? ฉันมีเธรดผู้ปฏิบัติงานตั้งไว้ที่ 64 และเธรดการทำงานของ gunicorn ตั้งค่าเป็น 8 แต่การปรับแต่งค่าเหล่านี้ดูเหมือนจะไม่ช่วยหรือทำร้ายฉันมากนัก

ค. มีการตั้งค่าระดับ linux ที่ จำกัด การเชื่อมต่อขาเข้าของฉันหรือไม่?

d อะไรที่ทำให้ประสิทธิภาพของฉันลดลงถึง 250r / s จากการทดสอบที่ใช้เวลานาน อีกครั้งหน่วยความจำไม่ได้สูงสุดในระหว่างการทดสอบเหล่านี้และการใช้ HDD ไม่มีศูนย์

ขอบคุณล่วงหน้าทั้งหมด :)

แก้ไข นี่คือการตั้งค่า nginx ของฉัน - http://pastie.org/1450749 - ส่วนใหญ่เป็นวานิลลาที่มีไขมันที่ชัดเจนถูกตัดออก


คุณกำลังสร้างคำถามหลายข้อในหนึ่งโพสต์พิจารณาแก้ไข ฉันแค่แสดงความคิดเห็นและไม่ใช่คำตอบเพราะฉันไม่สามารถตอบทุกส่วนได้ ฉันคิดว่าคุณได้พิจารณาประสิทธิภาพของ Python / Django แล้วมันไม่เหมาะสำหรับความเร็วที่มากที่สุด เกี่ยวกับ 1200 req / s ซึ่งฟังดูต่ำมากสำหรับสิ่งที่ฉันคิดว่าเป็นการตอบสนอง 1px gif หรือ HTTP 204 ดู fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world (24k req / s ทำงานบน localhost แต่ใช้ 1 คนทำงาน nginx เท่านั้น)
Jesper M

ความคิดเห็น Goldmine ขอบคุณมาก ฉันจะอ่านโพสต์และกลับมาพร้อมกับสิ่งที่ฉันค้นพบ; ขอบคุณสำหรับตัวชี้ "หลายคำถาม"!
linkedlinked

คำตอบ:


8

คุณกำลังดูถูกคนทำงานของ Nginx ไม่จำเป็นต้องเรียกใช้แรงงานจำนวนมาก คุณควรใช้แรงงานมากเท่าที่คุณมีซีพียูและเรียกมันว่าวัน หากคุณใช้ gunicorn บนเซิร์ฟเวอร์เดียวกันคุณควร จำกัด จำนวนคนงาน nginx เป็นสองคน มิฉะนั้นคุณเพียงแค่ไปที่ซีพียูที่มีการสลับบริบททั้งหมดที่จำเป็นในการจัดการกระบวนการเหล่านั้นทั้งหมด


1
อ่าขอบคุณ การแสดงดูเหมือนกันกับ 64 เหมือนเดิมกับ 2 แต่ฉันรู้ว่า WTF ไม่ได้ทำ ขอบคุณสำหรับการชี้แจง
linkedlinked

คุณสามารถแชร์การกำหนดค่า Nginx ของคุณได้หรือไม่? เป็นการยากที่จะให้คำแนะนำในการปรับแต่งเมื่อเราไม่รู้ว่าเรากำลังจูนอะไรอยู่
blueben

2

ฉันใช้ nginx เพื่อให้บริการคำขอ 5K วินาทีสำหรับเนื้อหาคงที่ คุณสามารถเพิ่มจำนวนของ worker_connections ซึ่งปัจจุบันถูกตั้งค่าเป็น 1024

การคำนวณ max_client จะเป็นดังนี้

worker_connections และ worker_proceses จากส่วนหลักช่วยให้คุณสามารถคำนวณค่า maxclients:

max_clients = worker_processes * worker_connections

ในสถานการณ์พร็อกซีย้อนกลับ max_clients จะกลายเป็น

max_clients = worker_processes * worker_connections / 4

http://wiki.nginx.org/EventsModule#worker_connections

การคำนวณการเชื่อมต่อผู้ปฏิบัติงานสูงสุดนั้นง่ายเมื่อคุณทราบความสามารถในการตั้งค่าของคุณ ความจุ / จำนวนแกนทั้งหมดคือการเชื่อมต่อของผู้ปฏิบัติงานสูงสุด ในการคำนวณความจุทั้งหมดมีหลายวิธี

  1. ฉันขอแนะนำให้คุณลองและกำหนดมาตรฐานการตั้งค่าของคุณที่จะให้ตัวเลขที่สมจริงที่สุด คุณสามารถใช้เครื่องมือต่าง ๆ เช่นการจู่โจมชกต่อย apache bench ฯลฯ อย่าลืมที่จะวัดการใช้ทรัพยากรระบบในระหว่างการทดสอบ

หากคุณใช้วิธีการข้างต้นไม่ได้ผลโปรดลองวิธีการด้านล่าง ฉันกำลังทำสมมติฐานแบบกว้างโดยไม่สนใจ RAM และ IO พวกเขาจะคำนึงถึง แต่สิ่งเหล่านี้จะให้จุดเริ่มต้นและคุณสามารถปรับได้จากที่นั่น

  1. สมมติว่าแบนด์วิดธ์เป็นคอขวดใช้ขนาดวัตถุเฉลี่ยที่ nginx ให้บริการและแบ่งแบนด์วิดท์ของคุณด้วยและคุณจะได้รับ qps ที่รองรับสูงสุด

  2. ในสมมติฐานที่สอง CPU คือคอขวด ในกรณีนี้วัดเวลาที่ร้องขอและหาร 1 ด้วยค่านั้นและคูณด้วยจำนวนแกนในระบบของคุณ สิ่งนี้จะให้จำนวนคำขอต่อวินาที nginx ที่สามารถจัดการได้


เราควรพิจารณาว่าคุณจะเพิ่มผู้ปฏิบัติงานได้อย่างไรและควรมีการตั้งค่าที่เหมาะสมที่สุดสำหรับเซิร์ฟเวอร์ที่กำหนดไว้อย่างไร
Kato

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