เนื้อหานี้มีการพูดคุยกันหลายครั้งใน cnblogs ฉันได้อ่านข้อมูลบางอย่างในช่วงสองวันที่ผ่านมาและเห็นตัวชี้วัดประสิทธิภาพที่เรียบง่ายและพูดคุยกับทุกคน
ซ็อกเก็ต + เธรด/ThreadPool
ประสิทธิภาพโดยประมาณ: น้อยกว่า 1,500 การเชื่อม
ต่อ การใช้งาน: ยอมรับซ็อกเก็ตและปล่อยให้เป็นเธรดที่จะจัดการ มันค่อนข้างโง่ แต่ก็มีประสิทธิภาพมากกว่าเช่นกัน เนื่องจากเป็นวิธีซิงโครนัสจึงสะดวกมากในการควบคุม สิ่งที่ก้าวหน้ากว่านั้นคือส่งมอบให้กับเธรดพูลเพื่อการจัดการ เธรดพูลจะถูกโฮสต์โดยระบบโดยอัตโนมัติ ซึ่งช่วยประหยัดเวลาของเธรดโอเวอร์เฮด สำหรับโครงการขนาดเล็กทั่วไป การดำเนินการนี้ก็เพียงพอแล้วและการพัฒนาก็ทำได้ง่าย แต่โปรดทราบว่าหากหลายซ็อกเก็ตใช้เธรดในเธรดพูลเป็นเวลานานและมีการเชื่อมต่ออื่น ๆ มากมาย เป็นเรื่องง่ายที่จะได้รับข้อความแจ้งว่าคุณมีเธรดไม่เพียงพอที่จะใช้ ฮ่าๆ เป็นความคิดที่ดีที่จะปล่อยให้ Socket ทำงานน้อยลงและใช้เวลาน้อยลง การเปลี่ยนไปใช้ CPU ที่เร็วขึ้นถือเป็นวิธีที่ดี นอกจากนี้ หากมีส่วนประกอบเธรดพูลของบริษัทอื่นที่ดีกว่า คุณยังสามารถเลือกใช้ส่วนประกอบเหล่านั้นได้ เช่น SmartThreadPool
ซ็อกเก็ต+เลือก
ประสิทธิภาพโดยประมาณ: ประสิทธิภาพลดลงหลังจากการเชื่อมต่อมากกว่า 1,500 ครั้ง
การใช้งาน: Select เป็นรูปแบบที่ใช้กันทั่วไป คือการสำรวจซ็อกเก็ตตั้งแต่หนึ่งซ็อกเก็ตขึ้นไปในฟังก์ชันการบล็อก และวางซ็อกเก็ตที่จะประมวลผลลงใน IList เมื่อการเลือกโพลเสร็จสิ้น เราจะประมวลผลซ็อกเก็ตใน IList นี้ด้วยตัวเราเอง สำหรับการใช้งานเฉพาะ โปรดดูที่ MSDN ประสิทธิภาพของ Select ไม่สามารถพูดได้ว่าสูง เนื่องจากเมื่อมี Sockets จำนวนมากที่ต้องประมวลผลในคิว การประมวลผล Sockets ล่าสุดสองสามรายการจะเทียบเท่ากับการข้ามผ่าน Sockets ก่อนหน้านี้ทั้งหมด ซึ่งไม่ประหยัดมากนัก
ซ็อกเก็ต+อะซิงโครนัส
ประสิทธิภาพโดยประมาณ: การเชื่อมต่อไคลเอนต์ประมาณ 7500
การใช้งาน: BeginXXXX, EndXXXX เราทุกคนคุ้นเคยกับมัน ในการวิเคราะห์ขั้นสุดท้าย ซ็อกเก็ตอะซิงโครนัสยังคงใช้เทคโนโลยีเธรดพูล โดยใช้เธรดพูลเพื่อจัดการ IO แบบอะซิงโครนัส สิ่งนี้ทำให้เกิดคำถามอีกประการหนึ่งว่ามีการใช้วิธีการใดสำหรับเธรดพูลของ .NET ฉันเคยเห็นคนพูดมาก่อนว่าเธรดพูลของ .NET นั้นถูกนำไปใช้โดยใช้พอร์ตที่สมบูรณ์ ฉันไม่รู้ว่าสิ่งนี้ถูกต้องหรือไม่ จากข้อมูลที่เจอ (หวังว่าเพื่อนคงจะบอกได้นะครับ) ซ็อกเก็ตแบบอะซิงโครนัสมีความซับซ้อนมากกว่าโฟลว์การประมวลผลโปรแกรมแบบซิงโครนัสมากและการควบคุมฟังก์ชันการโทรกลับแบบอะซิงโครนัสนั้นไม่ง่ายเท่ากับวิธีซิงโครนัส แต่สิ่งหนึ่งที่ฉันคิดว่าควรสังเกตคือควรใช้ฟังก์ชันการโทรกลับอย่างเบามือและไม่ควรจัดการธุรกรรมมากเกินไป การประมวลผลข้อมูลที่ถ่ายโอนควรปล่อยให้เธรดอื่นทำการประมวลผล
IOCP (พอร์ตเสร็จสิ้น)
ประสิทธิภาพโดยประมาณ: ประมาณ 20,000~50,000 การเชื่อมต่อไคลเอนต์
การใช้งาน: มี pseudo-IOCP บางส่วนภายใต้ .NET ฉันไม่เห็นตัวอย่าง SOCKET แบบเปิดใด ๆ ที่นำไปใช้งานโดยใช้ pseudo-IOCP เหล่านี้ การเชื่อมต่อไคลเอ็นต์ 20,000~50,000 รายการที่ฉันพูดถึงนั้นอ้างอิงถึงสถานการณ์การพัฒนาภายใต้ C++ ในกรณีนี้ เทคโนโลยีพื้นฐานที่จำเป็นต้องใช้ ได้แก่ พูลหน่วยความจำ อัลกอริธึมการสืบค้น ฯลฯ
ไม่มีข้อมูลที่จะตรวจสอบจำนวนการเชื่อมต่อสูงสุดที่ pseudo-IOCP สามารถทำได้ หากใครทราบ คุณสามารถพูดคุยได้ นอกจากนี้ข้อมูลจำนวนมากที่กล่าวมาข้างต้นคัดลอกมาจากข้อมูลบางส่วนซึ่งผมยังไม่ได้ลองด้วยตัวเองผมเพียงแต่นำออกมาเพื่อหารือกับทุกคนเท่านั้น ผมคิดว่าโปรแกรมเซิร์ฟเวอร์ประสิทธิภาพสูงอาจต้องใช้เทคโนโลยีที่ไม่ใช่แค่รุ่นที่จะใช้เท่านั้นแต่ยังมีรายละเอียดอีกมากมายที่ต้องใส่ใจ เช่น การประมวลผลหน่วยความจำ อัลกอริธึมที่จะใช้ เป็นต้น ซึ่งแน่นอนว่านี่คือ เฉพาะในส่วนของค่าซอฟต์แวร์เท่านั้น จะต้องมีการลงทุนด้านฮาร์ดแวร์อย่างแน่นอน