อัตราที่เซิร์ฟเวอร์ของฉันสามารถยอมรับ () การเชื่อมต่อ TCP ขาเข้าใหม่นั้นแย่มากภายใต้ Xen การทดสอบเดียวกันกับฮาร์ดแวร์โลหะเปลือยจะแสดงความเร็วสูงสุด 3-5x
- ทำไมสิ่งนี้ถึงแย่มากใน Xen
- คุณสามารถปรับแต่ง Xen เพื่อปรับปรุงประสิทธิภาพสำหรับการเชื่อมต่อ TCP ใหม่ได้หรือไม่?
- มีแพลตฟอร์มเวอร์ช่วลไลเซชั่นอื่น ๆ ที่เหมาะสมกว่าสำหรับกรณีการใช้งานประเภทนี้หรือไม่?
พื้นหลัง
เมื่อเร็ว ๆ นี้ฉันได้ทำการค้นคว้าปัญหาคอขวดของเซิร์ฟเวอร์ Java ที่พัฒนาแล้วซึ่งทำงานภายใต้ Xen เซิร์ฟเวอร์พูด HTTP และรับสายการเชื่อมต่อ TCP คำขอ / ตอบกลับ / ตัดการเชื่อมต่อที่ง่าย
แต่ในขณะที่การส่งปริมาณการรับส่งข้อมูลไปยังเซิร์ฟเวอร์ก็ไม่สามารถยอมรับการเชื่อมต่อ TCP มากกว่า ~ 7000 ต่อวินาที (บนอินสแตนซ์ 8-core EC2, c1.x ใหญ่ที่ใช้ Xen) ในระหว่างการทดสอบเซิร์ฟเวอร์ยังมีพฤติกรรมที่แปลกที่หนึ่งคอร์ (ไม่จำเป็นต้องเป็น cpu 0) ได้รับโหลดมาก> 80% ในขณะที่แกนอื่น ๆ ยังคงว่างอยู่ นี่ทำให้ฉันคิดว่าปัญหาเกี่ยวข้องกับเคอร์เนล / virtualization พื้นฐาน
เมื่อทำการทดสอบสถานการณ์เดียวกันบนโลหะเปลือยแพลตฟอร์มที่ไม่มีการจำลองเสมือนฉันได้รับผลการทดสอบแสดงอัตราการยอมรับ TCP () เกิน 35,000 / วินาที นี่เป็นเครื่องหลักของ Core i5 4 ที่ใช้อูบุนตูพร้อมแกนทั้งหมดเกือบเต็มอิ่ม สำหรับฉันแล้วรูปแบบนั้นดูถูกต้อง
ในอินสแตนซ์ Xen อีกครั้งฉันได้ลองเปิดใช้งาน / ปรับแต่งเกือบทุกการตั้งค่าที่มีใน sysctl.conf รวมถึงการเปิดใช้งานการรับแพ็กเก็ตพวงมาลัยและรับโฟลว์คอลลิ่งและการปักเธรด / กระบวนการไปยังซีพียู แต่ไม่มีผลกำไรที่ชัดเจน
ฉันรู้ว่าต้องลดประสิทธิภาพลงเมื่อใช้งานระบบเสมือนจริง แต่ในระดับนี้ เซิร์ฟเวอร์โลหะเปลือยที่ทำงานช้ากว่านั้นทำงานได้ดีกว่า 8-core โดยปัจจัย 5?
- นี่เป็นพฤติกรรมที่คาดหวังของ Xen หรือไม่?
- คุณสามารถปรับแต่ง Xen เพื่อปรับปรุงประสิทธิภาพสำหรับการเชื่อมต่อ TCP ใหม่ได้หรือไม่?
- มีแพลตฟอร์มเวอร์ช่วลไลเซชั่นอื่น ๆ ที่เหมาะสมกว่าสำหรับกรณีการใช้งานประเภทนี้หรือไม่?
ทำซ้ำพฤติกรรมนี้
เมื่อตรวจสอบเพิ่มเติมและระบุปัญหาฉันพบว่าเครื่องมือทดสอบประสิทธิภาพnetperfสามารถจำลองสถานการณ์ที่คล้ายกันที่ฉันพบ การใช้การทดสอบ TCP_CRR ของ netperf ฉันได้รวบรวมรายงานต่าง ๆ จากเซิร์ฟเวอร์ที่แตกต่างกัน (ทั้งแบบเสมือนจริงและแบบไม่บริสุทธิ์) หากคุณต้องการมีส่วนร่วมกับการค้นพบบางอย่างหรือค้นหารายงานปัจจุบันของฉันโปรดดูhttps://gist.github.com/985475
ฉันจะรู้ได้อย่างไรว่าปัญหานี้ไม่ได้เกิดจากซอฟต์แวร์ที่เขียนไม่ดี?
- เซิร์ฟเวอร์ได้รับการทดสอบกับฮาร์ดแวร์โลหะเปลือยและมันเกือบจะทำให้แกนประมวลผลทั้งหมดที่มีอยู่นั้นอิ่มตัว
- เมื่อใช้การเชื่อมต่อ TCP แบบ keep-alive ปัญหาจะหายไป
ทำไมสิ่งนี้จึงสำคัญ
ที่ESN (นายจ้างของฉัน) ฉันเป็นหัวหน้าโครงการของBeaconpush เซิร์ฟเวอร์ Comet / Web Socket ที่เขียนด้วย Java แม้ว่ามันจะมีประสิทธิภาพสูงและสามารถทำให้แบนด์วิดท์เกือบเต็มตามที่กำหนดภายใต้เงื่อนไขที่เหมาะสม แต่ก็ยัง จำกัด ว่าจะสามารถสร้างการเชื่อมต่อ TCP ใหม่ได้เร็วเพียงใด นั่นคือถ้าคุณมีผู้ใช้ขนาดใหญ่ปั่นป่วนที่ผู้ใช้มาและไปบ่อยการเชื่อมต่อ TCP จำนวนมากจะต้องมีการตั้งค่า / ฉีกขาด เราพยายามที่จะลดการเชื่อมต่อนี้ให้มีชีวิตอยู่ได้นานที่สุด แต่ในท้ายที่สุดประสิทธิภาพการยอมรับ () คือสิ่งที่ทำให้แกนของเราไม่หมุนและเราไม่ชอบมัน
อัปเดต 1
มีคนโพสต์คำถามนี้ใน Hacker Newsมีคำถาม / คำตอบอยู่ด้วย แต่ฉันจะพยายามรักษาคำถามนี้ให้ทันสมัยกับข้อมูลที่ฉันพบเมื่อฉันไป
ฮาร์ดแวร์ / แพลตฟอร์มที่ฉันได้ทำการทดสอบใน:
- EC2 ที่มีอินสแตนซ์ประเภท c1.x large (8 cores, 7 GB RAM) และ cc1.4xlarge (2x Intel Xeon X5570, 23 GB RAM) AMIs ที่ใช้คือ ami-08f40561 และ ami-1cad5275 ตามลำดับ บางคนชี้ให้เห็นว่า "กลุ่มความปลอดภัย" (เช่นไฟร์วอลล์ EC2s) อาจส่งผลกระทบเช่นกัน แต่สำหรับสถานการณ์จำลองการทดสอบนี้ฉันได้ลอง localhost เพื่อกำจัดปัจจัยภายนอกเช่นนี้ ข่าวลืออื่นที่ฉันได้ยินมาว่าอินสแตนซ์ EC2 ไม่สามารถผลักดัน PPS ได้มากกว่า 100k
- เซิร์ฟเวอร์เสมือนจริงส่วนตัวสองเครื่องที่ใช้งาน Xen หนึ่งมีภาระเป็นศูนย์ก่อนการทดสอบ แต่ไม่ได้สร้างความแตกต่าง
- เซิร์ฟเวอร์ Xen ส่วนตัวที่ Rackspace เกี่ยวกับผลลัพธ์เดียวกันมี
ฉันกำลังดำเนินการทดสอบเหล่านี้อีกครั้งและกรอกรายงานที่https://gist.github.com/985475หากคุณต้องการความช่วยเหลือโปรดบริจาคตัวเลขของคุณ มันเป็นเรื่องง่าย!
(แผนปฏิบัติการถูกย้ายไปที่คำตอบที่แยกต่างหากและรวมแล้ว)