ฉันต้องการค้นหาการกำหนดค่า / ฮาร์ดแวร์ที่ดีที่สุดที่เป็นไปได้ในการส่งมอบ 40Gbps จากเซิร์ฟเวอร์เดียวในคำถามนี้
สถานการณ์
เรามีพร็อกซีเซิร์ฟเวอร์แชร์วิดีโอที่ช่วยลดยอดเขาจากเซิร์ฟเวอร์จัดเก็บข้อมูลช้าที่อยู่ด้านหลัง การรับส่งข้อมูลทั้งหมดเป็น HTTP เท่านั้น เซิร์ฟเวอร์ทำหน้าที่เป็นพร็อกซีย้อนกลับ (ไฟล์ที่ไม่ได้เก็บไว้ในเซิร์ฟเวอร์) และเว็บเซิร์ฟเวอร์ (ไฟล์ที่เก็บไว้ในไดรฟ์ในระบบ)
ขณะนี้มีบางอย่างเช่นไฟล์ 100TB และเติบโตบนเซิร์ฟเวอร์หน่วยเก็บข้อมูลส่วนหลัง
กลไกการแคชถูกนำไปใช้อย่างอิสระและคำถามนี้ไม่เกี่ยวกับการแคชตัวเองเนื่องจากทำงานได้ดีมาก - ปัจจุบันมีขนาด 14Gbps ส่งผ่านไปยังเซิร์ฟเวอร์ส่วนหลังเพียง 2Gbps ดังนั้นการใช้แคชจึงดี
เป้าหมาย
รับ 40Gbps หรือปริมาณงานที่มากขึ้นจากเครื่องเดียว
ฮาร์ดแวร์ 1
HW: Supermicro SC825, X11SSL-F, Xeon E3-1230v5 (4C/8T@3.4GHz), 16GB DDR4 RAM, 2x Supermicro 10G STGN-i1S (LACP L3 + 4)
SSD: 1x 512GB Samsung, 2x 500GB Samsung, 2x480GB Intel 535, 1x 240GB Intel S3500
ระบบ:
- irqbalancer หยุดทำงาน
- set_irq_affinity สำหรับแต่ละอินเตอร์เฟส (ผ่านสคริปต์ใน tarx driver ixgbe)
- ixgbe-4.3.15
- กำหนดเวลา I / O กำหนดเวลา
- iptables ว่างเปล่า (โมดูลที่ไม่ได้โหลด)
- ระบบไฟล์: XFS
Nginx:
- sendfile ปิด
- หัวข้อ aio
- directio 1 ล
- tcp_nopush บน
- tcp_nodelay บน
เท่าที่เห็นในกราฟเราสามารถผลักดัน 12.5Gbps น่าเสียดายที่เซิร์ฟเวอร์ไม่ตอบสนอง
มี 2 สิ่งที่ทำให้ฉันสนใจ อันแรกคือ IRQ ปริมาณสูง ในกรณีนี้ฉันไม่มีกราฟจาก / proc / ขัดจังหวะ สิ่งที่สองคือโหลดระบบสูงซึ่งฉันคิดว่าเกิดจาก kswapd0 มีปัญหาในการทำงานกับ RAM 16G เท่านั้น
ฮาร์ดแวร์ 2
HW: Supermicro SC119TQ, X10DRW-i, 2x Xeon E5-2609v4 (8C/8T@1.70GHz), RAM DDR4 128GB, 2x Supermicro 10G STGN-i1S
SSD, การกำหนดค่าระบบเหมือนกับฮาร์ดแวร์ 1. Nginx เปิดใช้ sendfile (aio / sendfile เปรียบเทียบเพิ่มเติม)
ดูเหมือนจะดีกว่าตอนนี้เมื่อเรามีเซิร์ฟเวอร์ซึ่งทำงานได้ดีเราสามารถลองเพิ่มประสิทธิภาพได้
Sendfile vs aio threads
ฉันพยายามปิดการใช้งาน sendfile และใช้เธรด aio แทน
- sendfile ปิด
- หัวข้อ aio
- directio 1M (ซึ่งตรงกับไฟล์ทั้งหมดที่เรามี)
VS
- เปิดไฟล์
จากนั้นเวลา 15:00 นฉันเปลี่ยนกลับไปเป็น sendfile และโหลดใหม่ nginx (ดังนั้นจึงใช้เวลาสักครู่เพื่อสิ้นสุดการเชื่อมต่อที่มีอยู่) เป็นเรื่องดีที่การใช้งานไดรฟ์ (วัดโดย iostat) ลดลง ไม่มีอะไรเปลี่ยนแปลงกับปริมาณการใช้งาน (น่าเสียดายที่ zabbix ตัดสินใจที่จะไม่รวบรวมข้อมูลจาก bond0)
sendfile เปิด / ปิด
เพียงแค่พยายามเปลี่ยนเปิด / ปิดการส่ง ไม่มีอะไรเปลี่ยนแปลงยกเว้นการขัดจังหวะการกำหนดเวลาใหม่
irqbalancer เป็นเซิร์ฟเวอร์ / cron / ปิดใช้งาน
ดังที่ @lsd กล่าวว่าฉันพยายามตั้งค่า irqbalancer ให้ดำเนินการผ่าน cron:
*/5 * * * * root /usr/sbin/irqbalance --oneshot --debug 3 > /dev/null
น่าเสียดายที่มันไม่ได้ช่วยในกรณีของฉัน หนึ่งในการ์ดเครือข่ายเริ่มทำงานผิดปกติ:
ฉันไม่พบสิ่งผิดปกติในกราฟและเมื่อมันเกิดขึ้นในวันถัดไปอีกครั้งฉันเข้าสู่เซิร์ฟเวอร์และเห็นว่าหนึ่งคอร์นั้นอยู่ที่ 100% (การใช้ระบบ)
ฉันพยายามเริ่ม irqbalance เป็นบริการผลลัพธ์ยังคงเหมือนเดิม
จากนั้นฉันตัดสินใจใช้สคริปต์ set_irq_affinity และแก้ไขปัญหาได้ทันทีและเซิร์ฟเวอร์ผลัก 17Gbps อีกครั้ง
ฮาร์ดแวร์ 3
เราได้อัพเกรดเป็นฮาร์ดแวร์ใหม่: 2U 24 (+2) ไดรฟ์แชสซี (6xSFF), 2x Xeon E5-2620v4, 64GB DDR4 RAM (โมดูล 4x16GB), 13x SSD, 2x Supermicro (พร้อมชิป Intel) CPU ใหม่ปรับปรุงประสิทธิภาพมากขึ้น
การตั้งค่าปัจจุบันยังคงอยู่ - sendfile ฯลฯ ความแตกต่างเพียงอย่างเดียวคือเราให้ CPU เพียงตัวเดียวจัดการการ์ดเครือข่ายทั้งสอง (ผ่านสคริปต์ set_irq_affinity)
ถึงขีด จำกัด 20Gbps แล้ว
เป้าหมายต่อไปหรือไม่ 30Gbps
รู้สึกอิสระที่จะยิงมาที่ฉันความคิดวิธีการปรับปรุงประสิทธิภาพ ฉันยินดีที่จะทดสอบมันแบบสดๆและแบ่งปันกราฟหนัก ๆ ที่นี่
ความคิดใดที่จะจัดการกับ SoftIRQs จำนวนมากบน cpu ได้บ้าง?
นี่ไม่ใช่คำถามเกี่ยวกับการวางแผนกำลังการผลิต - ฉันมีฮาร์ดแวร์และการรับส่งข้อมูลอยู่แล้ว ฉันสามารถแยกการรับส่งข้อมูลไปยังเซิร์ฟเวอร์ต่าง ๆ ได้เสมอ (ซึ่งฉันจะต้องทำในอนาคต) และแก้ไขปัญหาเกี่ยวกับเงิน นี่คือคำถามเกี่ยวกับการปรับระบบและปรับแต่งประสิทธิภาพในสถานการณ์จริง