เป็นไปได้หรือไม่ที่จะประมวลผลดาต้าแกรมนับล้านต่อวินาทีด้วย Windows


11

ฉันกำลังตรวจสอบว่าฉันสามารถใช้แอพ HPC บน Windows ที่ได้รับดาต้ามัลติคาสต์ UDP ขนาดเล็ก (ส่วนใหญ่ 100-400 ไบต์) ในอัตราที่สูงโดยใช้โหลหรือมากกว่า 200 กลุ่มแบบหลายผู้รับ (เช่นใช้ MSI-X และ RSS ฉันสามารถ สเกลเป็นหลายคอร์) ทำการประมวลผลบางอย่างต่อแพ็คเก็ตแล้วส่งออกไป การส่งผ่าน TCP ฉันสามารถเพิ่มขึ้นเท่าที่ฉันต้องการ (6.4Gb / วินาที) โดยไม่ชนกำแพง แต่ได้รับดาตาแกรมที่อัตรา pps สูงกลายเป็นปัญหา

ในการทดสอบเมื่อเร็ว ๆ นี้กับเครื่อง NUMA ที่มีสเปคสูงด้วย 2-port 10Gb ethernet NIC บน Windows 2012 R2 ฉันสามารถรับ UDP ดาต้าแกรมนับแสนต่อวินาทีเท่านั้น ลบค่าใช้จ่ายในการประมวลผลของ app ของฉันจากสมการที่จะเห็นวิธีการที่รวดเร็วที่จะได้รับ) โดยใช้ 2x12 แกนและส่วนเคอร์เนลของกลุ่ม multicast 12 ทดสอบดูเหมือนจะได้รับการกระจายไปทั่ว 8 หรือ 10 แกนของโหนด NUMA หนึ่ง ( คิวแม็กซ์ RSSเป็นชุด ถึง 16) - แม้ว่าจะมีแอป. net ดังนั้นแอปที่ใช้ในเครื่องทั่วไปจึงสามารถทำงานได้เร็วขึ้น

แต่แม้กระทั่งHol Holgate ก็สามารถจัดการแพ็คเก็ต UDP ที่ 500kppsในการทดสอบ Windows RIO ประสิทธิภาพสูงของเขาโดยใช้ UDP payload ที่ 1024 ไบต์

ในQLogic ของเอกสาร (OS ภายใต้การทดสอบไม่ได้กล่าวถึง) ข้อ จำกัด ของ "มัลติเธรดแพ็คเก็ตขนาดเล็กพิเศษเส้นทาง" (เพื่อที่รวมทั้งการรับและการส่งต่อมา?) มีการตั้งค่าที่5.7Mpps ในบทความเกี่ยวกับระบบเครือข่าย Linuxขีด จำกัด ถูกตั้งค่าไว้ที่1Mpps ถึง 2Mppsต่อคอร์ (รายงานเพิ่มขนาดเชิงเส้นมากขึ้นหรือน้อยลงเป็นเส้นตรง) หรือแม้แต่15Mppsด้วยโซลูชันพิเศษที่ผ่านเคอร์เนล

เช่นnetmap

สามารถสร้างทราฟฟิกที่อัตราบรรทัด ( 14.88Mpps ) บนลิงก์ 10GigE ที่มีเพียงแกนเดียวที่ทำงานที่ 900Mhz ซึ่งเท่ากับวงจรนาฬิกาประมาณ 60-65 รอบต่อแพ็คเก็ตและปรับขนาดได้ดีกับแกนและความถี่สัญญาณนาฬิกา (ด้วย 4 คอร์ทำให้ได้อัตราสายที่น้อยกว่า 450 MHz) อัตราที่คล้ายกันจะมาถึงในวันที่ได้รับด้านข้าง

ดังนั้นฉันจะใช้เวลานานแค่ไหน (เวอร์ชั่นล่าสุด) ของ Windows / Windows Server โดยเฉพาะการรับมัลติคาสต์ UDP ตามที่อธิบายไว้ในย่อหน้านำ

แก้ไขมีการโพสต์ CloudFlare บล็อก - และส่วนความคิดเห็นที่น่าสนใจ - เกี่ยวกับวิธีการที่จะทำมันบน Linux: วิธีการรับล้านแพ็คเก็ตต่อวินาทีและมีที่สอดคล้องกันของแฮ็กเกอร์ความเห็นข่าวหน้า


@Ramhound ตามทฤษฎีแล้วอาจเป็นไปได้ใน Windows แต่ในทางปฏิบัติมันเป็นไปได้อย่างไร ถึงตอนนี้ฉันได้เจอรายงานจำนวนไม่มากจากผู้ที่บรรลุระดับเหล่านี้ใน linux บนฮาร์ดแวร์มาตรฐาน แต่ไม่ใช่รายงานเดียวที่เข้าใกล้ทุกที่ใน Windows และคุณคิดว่าฉันจะลดขอบเขตของคำถามได้อย่างไร เป็นเพียงแค่นี้: "มัลติคาสต์ UDP สูงสุดรับอัตราใน Windows คืออะไร" ข้อความจำนวนมากในคำถามของฉันเป็นเพียงตัวอย่างที่ควรแสดงให้เห็นว่าเป็นไปได้ด้วย linux - และฉันได้ทำการบ้านเสร็จแล้ว
Eugene Beresovsky

@Ramhound 'หากเป็นไปได้บน Linux จะเป็นไปได้บน Windows' ฉันไม่เห็นด้วยตามลำดับ .. ระบบหนึ่งที่นึกได้ทันทีคือ iptables .. โชคดีที่ล้อเลียนระบบนั้นบน windows ^ _ ^
NiCk Newman

ฉันไม่ได้พยายามอย่างหนักจริง ๆ ดังนั้นคุณสามารถนำรหัสทั้งหมดที่ฉันมีให้สำหรับการทดสอบ RIO ที่ฉันทำและผลักดันต่อไป
Len Holgate

คำตอบ:


5

จากข้อมูลของ Microsoft การทดสอบในห้องปฏิบัติการของพวกเขาแสดงให้เห็นว่า "บนเซิร์ฟเวอร์เฉพาะในการทดสอบก่อนหน้า" ของRIOพวกเขาสามารถจัดการได้

  • 2Mpps โดยไม่สูญเสียใน Windows Server 2008R2 คือไม่มี RIO
  • 4Mpps บน (เผยแพร่ล่วงหน้า) Windows Server 8 โดยใช้ RIO

ภาพหน้าจอจากวิดีโอนั้น (44:33):

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นคำตอบสำหรับคำถามของฉันIs it possible to process millions of datagrams per second with Windows?คือ: ใช่และเห็นได้ชัดว่าเป็นก่อนหน้า RIO ใน Windows Server 2008R2

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

  1. มีตัวเลขสำหรับส่งหรือไม่ ที่ได้รับ? หรืออาจเป็นเส้นทาง (เช่นรับ + ​​ส่ง)?
  2. แพ็คเก็ตขนาดไหน? -> อาจเป็นไปได้ที่ต่ำที่สุดเท่าที่จะเป็นไปได้โดยทั่วไปแล้วเมื่อพยายามที่จะทำให้ตัวเลข pps อวดตัว
  3. หลายวิธีการเชื่อมต่อ (ถ้า TCP) ลำธาร / แพ็คเก็ต (ถ้า UDP) ? -> อาจจะมากเท่าที่จำเป็นในการแจกจ่ายเวิร์กโหลดดังนั้นคอร์ทั้งหมดที่มีอยู่สามารถใช้ได้
  4. การตั้งค่าการทดสอบอะไร รายละเอียดเครื่องและ NIC และสายไฟ

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


แก้ไขฉันเพิ่งสะดุดกับเอกสาร Intel เกี่ยวกับการประมวลผลแพ็คเก็ตประสิทธิภาพสูงบน Linux และตามที่ (Linux)

แพลตฟอร์มสามารถรักษาอัตราการทำธุรกรรมประมาณ 2M ธุรกรรมต่อวินาที

ใช้สแต็กเครือข่าย Linux มาตรฐาน (บนโฮสต์ฟิสิคัลที่มี 2x8 คอร์) ธุรกรรมในคำขอทดสอบ / ตอบกลับนี้รวมถึงทั้งสองอย่าง

  1. การรับแพ็คเก็ต UDP
  2. การส่งต่อที่ตามมาของแพ็กเก็ตนั้น

(ใช้ netserver ของ netperf) การทดสอบใช้ 100 รายการพร้อมกัน มีรายละเอียดเพิ่มเติมในเอกสารสำหรับผู้สนใจ ฉันหวังว่าเราจะมีลักษณะเช่นนี้สำหรับ Windows เพื่อเปรียบเทียบ ... อย่างไรก็ตามนี่เป็นแผนภูมิที่เกี่ยวข้องมากที่สุดสำหรับการทดสอบคำขอ / ตอบกลับ:

ป้อนคำอธิบายรูปภาพที่นี่


2

TL; DR

เพื่อให้คำตอบที่ชัดเจนการทดสอบเพิ่มเติมดูเหมือนจำเป็น แต่หลักฐานชี้ให้เห็นว่าลีนุกซ์เป็นระบบปฏิบัติการที่ใช้งานได้จริงในชุมชนที่มีความล่าช้าน้อยมากซึ่งยังประมวลผลปริมาณงาน Mpps เป็นประจำ ไม่ได้หมายความว่าเป็นไปไม่ได้กับ Windows แต่ Windows อาจจะล้าหลังไปเล็กน้อยแม้ว่ามันอาจเป็นไปได้ที่จะได้รับหมายเลข Mpps แต่นั่นจำเป็นต้องมีการทดสอบเพื่อยืนยันและเช่นหากพิจารณาว่าอะไร (CPU) มีค่าใช้จ่ายตัวเลขเหล่านั้นสามารถทำได้

NB นี่ไม่ใช่คำตอบที่ฉันตั้งใจจะยอมรับ มันมีวัตถุประสงค์เพื่อให้ทุกคนที่สนใจในการตอบคำถามบางคำแนะนำเกี่ยวกับสถานที่ที่เรายืนและสถานที่ที่จะตรวจสอบเพิ่มเติม


Len Holgate ผู้ซึ่งอ้างอิงจาก google ดูเหมือนจะเป็นคนเดียวที่ได้ทำการทดสอบ RIO เพื่อให้มีประสิทธิภาพมากขึ้นจากระบบเครือข่าย Windows (และเผยแพร่ผลลัพธ์) ได้ชี้แจงในข้อคิดเห็นในบล็อกของเขาว่าเขาใช้คำสั่งผสม IP / พอร์ตเดียว สำหรับการส่งแพ็กเก็ต UDP

กล่าวอีกนัยหนึ่งผลลัพธ์ของเขาควรเปรียบเทียบกับตัวเลขแกนเดี่ยวในการทดสอบบน Linux (แม้ว่าเขาจะใช้ 8 เธรด - ซึ่งโดยไม่ต้องตรวจสอบรหัสของเขาก็ดูเหมือนจะเป็นอันตรายต่อประสิทธิภาพเมื่อจัดการกระแสแพ็คเก็ต UDP เพียงครั้งเดียว ทำการประมวลผลอย่างหนักของแพ็กเก็ตและเขากล่าวถึงเพียงไม่กี่เธรดที่ใช้จริงซึ่งจะทำให้เข้าใจได้) แม้ว่าเขาจะพูดว่า:

ฉันไม่ได้พยายามอย่างหนักเพื่อให้ได้ประสิทธิภาพสูงสุดเพียงเพื่อเปรียบเทียบประสิทธิภาพที่สัมพันธ์กันระหว่าง API เก่าและใหม่ดังนั้นฉันจึงไม่ได้ทำการทดสอบอย่างละเอียด

แต่อะไรคือสิ่งที่ทำให้โซนความสะดวกสบาย (สัมพัทธ์) ของ IOCP มาตรฐานสำหรับโลก RIO คร่าวๆนอกจาก "พยายามอย่างหนัก"? อย่างน้อยที่สุดก็จะเกี่ยวข้องกับแพ็คเก็ต UDP กระแสข้อมูล

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

อย่างไรก็ตามปัญหาเมื่อพยายามเปรียบเทียบผลลัพธ์ของเขาโดยตรงกับการทดสอบอื่น ๆ ของ Linux / Unix / BSD คือ: การทดสอบส่วนใหญ่เมื่อพยายามผลักขอบเขต "แพ็คเก็ตต่อวินาที" ให้ใช้ขนาดแพ็กเก็ต / เฟรมที่เล็กที่สุดที่เป็นไปได้เช่น Ethernet เฟรมขนาด 64 ไบต์ Len ทดสอบแพ็คเก็ต 1024 ไบต์ (-> เฟรม 1070 byte) ซึ่ง (โดยเฉพาะสำหรับ No-Nagle UDP) คุณจะได้รับตัวเลข "บิตต่อวินาที" ที่สูงขึ้นมาก แต่อาจไม่ผลักขอบเขต pps เท่าที่จะทำได้ด้วยแพ็กเก็ตขนาดเล็ก . ดังนั้นจึงไม่ยุติธรรมที่จะเปรียบเทียบตัวเลขเหล่านี้ตามที่เป็นอยู่

การสรุปผลการสืบเสาะของฉันใน Windows UDP ได้รับประสิทธิภาพ:

  • ไม่มีใครใช้ Windows จริงๆเมื่อพยายามพัฒนา latency ต่ำพิเศษและ / หรือแอปพลิเคชั่นปริมาณงานสูงวันนี้พวกเขาใช้ Linux
  • การทดสอบประสิทธิภาพและการรายงานผลจริงทั้งหมด (เช่นไม่ใช่การโฆษณาผลิตภัณฑ์) แทบทุกวันนี้อยู่บน Linux หรือ BSD (ขอบคุณ Len ที่เป็นผู้บุกเบิกและให้การอ้างอิงกับเราอย่างน้อยหนึ่งจุด!)
  • UDP (ซ็อกเก็ตมาตรฐาน) บน Windows เร็วกว่า / ช้ากว่าบน Linux หรือไม่ ฉันยังไม่สามารถบอกได้จะต้องทำการทดสอบของฉันเอง
  • UDP ประสิทธิภาพสูง (RIO vs netmap) บน Windows เร็วกว่า / ช้ากว่าบน Linux หรือไม่ Linux จัดการสายความเร็ว 10Gb ได้อย่างง่ายดายด้วยคอร์เดียวที่ 900MHz, Windows, ในกรณีที่ดีที่สุดที่เผยแพร่สามารถเพิ่มสูงถึง 43% หรือ 492kpps สำหรับขนาดแพ็คเก็ต UDP ขนาดใหญ่ 1024 เช่นตัวเลข bps สำหรับขนาดเล็กอาจจะมีนัยสำคัญ แย่กว่านั้นแม้ว่าตัวเลข pps จะเพิ่มขึ้น (ยกเว้นการจัดการขัดจังหวะหรือค่าใช้จ่ายพื้นที่เคอร์เนลอื่น ๆ เป็นปัจจัย จำกัด )

สำหรับเหตุผลที่พวกเขาใช้ linux นั้นจะต้องเป็นเพราะการพัฒนาโซลูชันที่เกี่ยวข้องกับการเปลี่ยนแปลงเคอร์เนลเช่น netmap หรือ RIO - จำเป็นเมื่อผลักดันประสิทธิภาพให้ถึงขีด จำกัด - เป็นไปไม่ได้เลยที่ระบบปิดเช่น Windows จะเป็นไปไม่ได้ หรือคุณมีสัญญาพิเศษกับ Microsoft นี่คือเหตุผลที่ RIO เป็นผลิตภัณฑ์ MS

ในที่สุดเพียงแค่ให้ตัวอย่างสุดยอดของสิ่งที่ฉันค้นพบและเกิดขึ้นในพื้นที่ Linux:

เมื่อ 15 ปีที่แล้วบางคนได้รับ 680kpps โดยใช้ซีพียู Pentium III 800 mHz , บัสด้านหน้า 133 mHz ใน 1GbE NIC แก้ไข : พวกเขาใช้คลิกเราเตอร์โหมดเคอร์เนลที่ข้ามเครือข่ายสแต็กมาตรฐานส่วนใหญ่นั่นคือพวกเขา "โกง"

ในปี 2013 Argon Design ได้รับการจัดการ

เลือกติ๊กเพื่อแลกเปลี่ยน latencies ให้น้อยที่สุด 35ns [nano seconds]

Btw พวกเขายังอ้างว่า

รหัสการคำนวณที่มีอยู่ส่วนใหญ่สำหรับการซื้อขายในปัจจุบันถูกเขียนขึ้นสำหรับ Linux บนสถาปัตยกรรมโปรเซสเซอร์ x86

และ Argon ใช้สวิตช์ Arista 7124FXซึ่ง (นอกเหนือจาก FPGA) มีระบบปฏิบัติการ

สร้างขึ้นบนเคอร์เนล Linux มาตรฐาน


0

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

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