เหตุใดประสิทธิภาพของ TCP จึงยอมรับ () ไม่ดีนักภายใต้ Xen


89

อัตราที่เซิร์ฟเวอร์ของฉันสามารถยอมรับ () การเชื่อมต่อ TCP ขาเข้าใหม่นั้นแย่มากภายใต้ Xen การทดสอบเดียวกันกับฮาร์ดแวร์โลหะเปลือยจะแสดงความเร็วสูงสุด 3-5x

  1. ทำไมสิ่งนี้ถึงแย่มากใน Xen
  2. คุณสามารถปรับแต่ง Xen เพื่อปรับปรุงประสิทธิภาพสำหรับการเชื่อมต่อ TCP ใหม่ได้หรือไม่?
  3. มีแพลตฟอร์มเวอร์ช่วลไลเซชั่นอื่น ๆ ที่เหมาะสมกว่าสำหรับกรณีการใช้งานประเภทนี้หรือไม่?

พื้นหลัง

เมื่อเร็ว ๆ นี้ฉันได้ทำการค้นคว้าปัญหาคอขวดของเซิร์ฟเวอร์ 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?

  1. นี่เป็นพฤติกรรมที่คาดหวังของ Xen หรือไม่?
  2. คุณสามารถปรับแต่ง Xen เพื่อปรับปรุงประสิทธิภาพสำหรับการเชื่อมต่อ TCP ใหม่ได้หรือไม่?
  3. มีแพลตฟอร์มเวอร์ช่วลไลเซชั่นอื่น ๆ ที่เหมาะสมกว่าสำหรับกรณีการใช้งานประเภทนี้หรือไม่?

ทำซ้ำพฤติกรรมนี้

เมื่อตรวจสอบเพิ่มเติมและระบุปัญหาฉันพบว่าเครื่องมือทดสอบประสิทธิภาพnetperfสามารถจำลองสถานการณ์ที่คล้ายกันที่ฉันพบ การใช้การทดสอบ TCP_CRR ของ netperf ฉันได้รวบรวมรายงานต่าง ๆ จากเซิร์ฟเวอร์ที่แตกต่างกัน (ทั้งแบบเสมือนจริงและแบบไม่บริสุทธิ์) หากคุณต้องการมีส่วนร่วมกับการค้นพบบางอย่างหรือค้นหารายงานปัจจุบันของฉันโปรดดูhttps://gist.github.com/985475

ฉันจะรู้ได้อย่างไรว่าปัญหานี้ไม่ได้เกิดจากซอฟต์แวร์ที่เขียนไม่ดี?

  1. เซิร์ฟเวอร์ได้รับการทดสอบกับฮาร์ดแวร์โลหะเปลือยและมันเกือบจะทำให้แกนประมวลผลทั้งหมดที่มีอยู่นั้นอิ่มตัว
  2. เมื่อใช้การเชื่อมต่อ 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หากคุณต้องการความช่วยเหลือโปรดบริจาคตัวเลขของคุณ มันเป็นเรื่องง่าย!

(แผนปฏิบัติการถูกย้ายไปที่คำตอบที่แยกต่างหากและรวมแล้ว)


3
งานที่ยอดเยี่ยมที่จะ pinpointing ปัญหา แต่ผมเชื่อว่าคุณจะได้รับการบริการที่ดีมากในรายการทาง Xen เฉพาะฟอรั่มการสนับสนุนหรือแม้กระทั่งXenSource เว็บไซต์รายงานข้อผิดพลาด ฉันเชื่อว่านี่อาจเป็นข้อผิดพลาดตัวกำหนดตารางเวลา - ถ้าคุณใช้การเชื่อมต่อ 7,000 * 4 คอร์ / 0.80 ซีพียูโหลดคุณจะได้รับ 35,000 - จำนวนที่คุณจะได้รับเมื่อ 4 คอร์จะอิ่มตัวเต็มที่
the-wabbit

อ่าและอีกอย่างหนึ่ง: ลองใช้รุ่นเคอร์เนล (รุ่นที่ใหม่กว่านี้) สำหรับแขกของคุณหากคุณทำได้
the-wabbit

@ syneticon-dj ขอบคุณ ฉันลองใช้ cc1.4x Large ที่ EC2 พร้อมเคอร์เนล 2.6.38 ฉันเห็นเพิ่มขึ้นประมาณ 10% ถ้าฉันไม่ผิด แต่มีโอกาสมากขึ้นเนื่องจากฮาร์ดแวร์ beefier ของประเภทอินสแตนซ์นั้น
cgbystrom

6
ขอบคุณที่รักษาข้อมูลนี้ให้ทันสมัยด้วยคำตอบ HN มันเป็นคำถามที่ดี ฉันขอแนะนำให้ย้ายแผนปฏิบัติการไปเป็นคำตอบรวมซึ่งอาจเป็นเพราะทั้งหมดนี้เป็นคำตอบที่เป็นไปได้สำหรับปัญหา
Jeff Atwood

@jeff ย้ายแผนการดำเนินการตรวจสอบ
cgbystrom

คำตอบ:


27

ตอนนี้: ประสิทธิภาพของแพ็คเก็ตเล็ก ๆ จะดูดภายใต้ Xen

(ย้ายจากคำถามไปยังคำตอบอื่นแทน)

ตามผู้ใช้บน HN (นักพัฒนา KVM?) นี่เป็นเพราะประสิทธิภาพของแพ็กเก็ตขนาดเล็กใน Xen และ KVM มันเป็นปัญหาที่ทราบกันดีเกี่ยวกับ virtualization และ ESX ของ VMWare จัดการได้ดีกว่านี้มาก นอกจากนี้เขายังตั้งข้อสังเกตว่า KVM จะนำคุณสมบัติใหม่บางออกแบบบรรเทานี้ ( โพสต์ต้นฉบับ )

ข้อมูลนี้ค่อนข้างท้อใจถ้ามันถูกต้อง ไม่ว่าจะด้วยวิธีใดฉันจะลองทำตามขั้นตอนด้านล่างจนกว่าอาจารย์กู Xen บางคนจะมาพร้อมคำตอบที่ชัดเจน :)

Iain Kay จากรายชื่อผู้รับจดหมายกราฟ netperf xen- ผู้ใช้รวบรวมกราฟนี้: สังเกตเห็นแถบ TCP_CRR เปรียบเทียบ "2.6.18-239.9.1.el5" เทียบกับ "2.6.39 (กับ Xen 4.1.0)"

แผนปฏิบัติการปัจจุบันตามคำตอบ / คำตอบที่นี่และจากHN :

  1. ส่งเรื่องนี้ไปยังรายชื่อผู้รับจดหมาย Xen ที่เฉพาะเจาะจงและ Bugzilla XenSource ที่แนะนำโดย syneticon-ดีเจข้อความถูกโพสต์ลงในรายการ Xen ผู้ใช้รอการตอบกลับ

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

  3. ลองใช้อินสแตนซ์ของผู้เยี่ยมชม PV Xen แบบ 32 บิตเนื่องจาก 64 บิตอาจทำให้โอเวอร์เฮนใน Xen เพิ่มขึ้น มีคนพูดถึงสิ่งนี้ใน HN ไม่ได้สร้างความแตกต่าง

  4. ลองเปิดใช้งาน net.ipv4.tcp_syncookies ใน sysctl.conf ตามที่แนะนำโดย abofh บน HN สิ่งนี้เห็นได้ชัดว่าอาจปรับปรุงประสิทธิภาพเนื่องจาก handshake จะเกิดขึ้นในเคอร์เนล ฉันไม่มีโชคกับสิ่งนี้

  5. เพิ่มงานในมือจาก 1024 ไปเป็นสิ่งที่สูงกว่ามากแนะนำโดย abofh บน HN สิ่งนี้อาจช่วยได้เนื่องจากแขกอาจยอมรับ () การเชื่อมต่อเพิ่มเติมในระหว่างการเรียกใช้ชิ้นส่วนจาก dom0 (โฮสต์)

  6. ตรวจสอบอีกครั้งว่า conntrack ถูกปิดใช้งานในเครื่องทุกเครื่องเนื่องจากสามารถลดอัตราการยอมรับได้ครึ่งหนึ่ง (แนะนำโดย deubeulyou) ใช่มันถูกปิดการใช้งานในการทดสอบทั้งหมด

  7. ตรวจสอบ "ฟังคิวล้นและถังข้อมูลซิงค์ล้นใน netstat -s" (แนะนำโดย mike_esspe บน HN)

  8. แยกการจัดการขัดจังหวะระหว่างหลายคอร์ (RPS / RFS ฉันพยายามเปิดใช้งานก่อนหน้านี้ควรจะทำเช่นนี้ แต่อาจคุ้มค่าลองอีกครั้ง) แนะนำโดย adamt ที่ HN

  9. ปิดการถ่ายโอนการแบ่งส่วน TCP และกระจาย / รวบรวมความเร่งตามที่ Matt Bailey แนะนำ (เป็นไปไม่ได้บน EC2 หรือโฮสต์ VPS ที่คล้ายกัน)


2
+1 โพสต์ผลการปฏิบัติงานเมื่อคุณพบ!
chrisaycock

มีคนแหย่ฉันทาง Twitter เกี่ยวกับคำถามนี้ น่าเสียดายที่ปัญหานี้ยังคงมีอยู่ ฉันไม่ได้ทำการวิจัยมากนักตั้งแต่ปีที่แล้ว Xen MAY ได้รับการปรับปรุงในช่วงเวลานี้ฉันไม่รู้ นักพัฒนา KVM ยังพูดถึงว่าพวกเขากำลังแก้ไขปัญหาเช่นนี้ อาจจะมีมูลค่าการใฝ่หา อีกคำแนะนำที่ฉันได้ยินคือลองใช้ OpenVZ แทน Xen / KVM เนื่องจากมันเพิ่มเลเยอร์ / การสกัดกั้น syscalls น้อยลงหรือไม่มีเลย
cgbystrom

21

โดยทั่วไปฉันพบว่าการปิดการเร่งด้วยฮาร์ดแวร์ NIC ช่วยเพิ่มประสิทธิภาพเครือข่ายบนคอนโทรลเลอร์ Xen (เช่นจริงสำหรับ LXC):

การกระจายการรวมกัน:

/usr/sbin/ethtool -K br0 sg off

การแบ่งส่วน TCP TCP:

/usr/sbin/ethtool -K br0 tso off

โดยที่ br0 คือบริดจ์หรืออุปกรณ์เครือข่ายของคุณบนโฮสต์ไฮเปอร์ไวเซอร์ คุณจะต้องตั้งค่านี้เพื่อปิดในทุกการบู๊ต YMMV


ฉันที่สองนี้ ฉันมีเซิร์ฟเวอร์ Windows 2003 ที่ทำงานบน Xen ซึ่งประสบปัญหาการสูญหายของแพ็กเก็ตที่น่ากลัวภายใต้เงื่อนไขปริมาณงานสูง ปัญหาหายไปเมื่อฉันปิดการใช้งาน TCP เซ็กเมนต์ offload
rupello

ขอบคุณ ฉันอัปเดต "แผนปฏิบัติการ" ในคำถามเดิมพร้อมคำแนะนำของคุณ
cgbystrom


3

บางทีคุณอาจจะอธิบายให้กระจ่างขึ้นเล็กน้อย - คุณรันการทดสอบภายใต้ Xen บนเซิร์ฟเวอร์ของคุณเองหรือบนอินสแตนซ์ EC2 เท่านั้นหรือไม่

ยอมรับเป็นเพียง syscall อื่นและการเชื่อมต่อใหม่จะแตกต่างกันเพียงว่าแพ็กเก็ตสองสามตัวแรกจะมีค่าสถานะเฉพาะ - ไฮเปอร์ไวเซอร์เช่น Xen ไม่ควรเห็นความแตกต่างแน่นอน ส่วนอื่น ๆ ของการตั้งค่าของคุณอาจ: ใน EC2 เช่นฉันจะไม่แปลกใจถ้ากลุ่มความปลอดภัยมีส่วนเกี่ยวข้อง conntrack นอกจากนี้ยังมีรายงานว่าจะลดลงครึ่งหนึ่งการเชื่อมต่อใหม่ยอมรับอัตรา (PDF)

สุดท้ายดูเหมือนจะมี CPU / รวมกันเป็นโปรแกรมที่ก่อให้เกิดการใช้งาน CPU แปลก / hangups บน EC2 (และอาจจะ Xen ทั่วไป) เป็นblogged เกี่ยวกับ Librato โดยเมื่อเร็ว ๆ นี้


ฉันอัปเดตคำถามและชี้แจงว่าฉันได้ลองใช้ฮาร์ดแวร์ตัวใด abofh ยังแนะนำให้เพิ่ม backlog เกิน 1024 เพื่อเพิ่มความเร็วในการรับ () s ที่เป็นไปได้ในระหว่างการดำเนินการ slice สำหรับแขก เกี่ยวกับ conntrack ฉันควรตรวจสอบอีกครั้งว่าสิ่งเหล่านั้นถูกปิดใช้งานขอบคุณ ฉันได้อ่านบทความ Liberato แล้ว แต่ด้วยจำนวนของฮาร์ดแวร์ที่แตกต่างกันที่ฉันลองทำมันไม่ควรเป็นอย่างนั้น
cgbystrom

0

ตรวจสอบให้แน่ใจว่าคุณปิดใช้งาน iptables และ hooks อื่น ๆ ในการเชื่อมต่อโค้ดใน dom0 เห็นได้ชัดว่ามันใช้ได้กับการติดตั้ง Xen บนเครือข่ายแบบบริดจ์เท่านั้น

echo 0 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 > /proc/sys/net/bridge.bridge-nf-call-arptables

ขึ้นอยู่กับขนาดของเซิร์ฟเวอร์ แต่ใช้หน่วยประมวลผลขนาดเล็ก (4-core processor) อุทิศซีพียูคอร์หนึ่งตัวให้กับ Xen dom0 และตรึงมันไว้ ตัวเลือกการบูต Hypervisor:

dom0_max_vcpus=1 dom0_vcpus_pin dom0_mem=<at least 512M>

คุณพยายามส่งผ่านอุปกรณ์อีเธอร์เน็ต PCI ไปยัง domU หรือไม่ ควรมีการเพิ่มประสิทธิภาพที่ดี

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