กล่าวโดยย่อ: คุณควรจะสามารถบรรลุตามลำดับของการเชื่อมต่อ TCP ที่ใช้งานพร้อมกันหลายล้านรายการและตามคำขอ HTTP ส่วนขยาย สิ่งนี้จะบอกคุณถึงประสิทธิภาพสูงสุดที่คุณคาดหวังได้จากแพลตฟอร์มที่เหมาะสมพร้อมการกำหนดค่าที่เหมาะสม
วันนี้ฉันกังวลว่า IIS กับ ASP.NET จะรองรับการเชื่อมต่อพร้อมกัน 100 ครั้งหรือไม่ (ดูที่การอัปเดตของฉันคาดว่าจะได้รับการตอบกลับ ~ 10k ต่อวินาทีใน ASP.Net Mono เวอร์ชันเก่า) เมื่อฉันเห็นคำถาม / คำตอบนี้ฉันอดไม่ได้ที่จะตอบตัวเองว่าหลาย ๆ คำตอบของคำถามนี้ไม่ถูกต้องทั้งหมด
กรณีที่ดีที่สุด
คำตอบสำหรับคำถามนี้ต้องเกี่ยวข้องกับการกำหนดค่าเซิร์ฟเวอร์ที่ง่ายที่สุดในการแยกตัวออกจากตัวแปรและการกำหนดค่าที่เป็นไปได้นับไม่ถ้วน
ลองพิจารณาสถานการณ์ต่อไปนี้สำหรับคำตอบของฉัน:
- ไม่มีการรับส่งข้อมูลในเซสชัน TCP ยกเว้นแพ็กเก็ตที่มีชีวิตอยู่ (ไม่เช่นนั้นคุณจะต้องใช้แบนด์วิดท์เครือข่ายและทรัพยากรคอมพิวเตอร์อื่น ๆ ในปริมาณที่สอดคล้องกัน)
- ซอฟต์แวร์ที่ออกแบบมาเพื่อใช้ซ็อกเก็ตและการเขียนโปรแกรมแบบอะซิงโครนัสแทนที่จะเป็นเธรดฮาร์ดแวร์ต่อคำขอจากพูล (เช่น IIS, Node.js, Nginx ... webserver [แต่ไม่ใช่ Apache] พร้อมแอพพลิเคชั่นซอฟต์แวร์ที่ออกแบบโดย async)
- CPU / Ram ประสิทธิภาพดี วันนี้โดยพลการสมมติว่า i7 (4 core) พร้อม RAM 8GB
- ไฟร์วอลล์ / เราเตอร์ที่ดีที่จะจับคู่
- ไม่มีขีด จำกัด เสมือน / ผู้ว่าราชการจังหวัด - เช่น Linux somaxconn, IIS web.config ...
- ไม่มีการพึ่งพาฮาร์ดแวร์อื่น ๆ ที่ช้ากว่า - ไม่มีการอ่านจากฮาร์ดดิสก์เนื่องจากจะเป็นตัวหารและคอขวดที่พบบ่อยที่สุดไม่ใช่ IO ของเครือข่าย
คำตอบโดยละเอียด
การออกแบบที่เชื่อมโยงเธรดแบบซิงโครนัสมักจะมีประสิทธิภาพที่แย่ที่สุดเมื่อเทียบกับการใช้งาน IO แบบอะซิงโครนัส
WhatsApp ได้รับล้านกับการจราจรบนระบบปฏิบัติการยูนิกซ์เดียวรสเครื่อง OS - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/
สุดท้ายนี้http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.htmlลงรายละเอียดมากมาย สำรวจว่าแม้กระทั่ง 10 ล้านก็สามารถทำได้ เซิร์ฟเวอร์มักมีฮาร์ดแวร์ TCP offload engine ASIC ที่ออกแบบมาสำหรับบทบาทเฉพาะนี้มีประสิทธิภาพมากกว่า CPU ที่ใช้งานทั่วไป
ตัวเลือกการออกแบบซอฟต์แวร์ที่ดี
การออกแบบ IO แบบอะซิงโครนัสจะแตกต่างกันไปตามระบบปฏิบัติการและแพลตฟอร์มการเขียนโปรแกรม Node.js ถูกออกแบบด้วยตรงกันในใจ คุณควรใช้สัญญาอย่างน้อยและเมื่อ ECMAScript 7 async
มาพร้อมawait
/ C # / Net มีการสนับสนุนแบบอะซิงโครนัสเต็มรูปแบบเช่น node.js อยู่แล้ว ไม่ว่าระบบปฏิบัติการและแพลตฟอร์มใดก็ตามควรคาดว่าอะซิงโครนัสจะทำงานได้ดีมาก และไม่ว่าคุณจะเลือกภาษาใดให้มองหาคำหลัก "อะซิงโครนัส" ภาษาสมัยใหม่ส่วนใหญ่จะมีการรองรับแม้ว่าจะเป็นส่วนเสริมของบางประเภทก็ตาม
ไปที่ WebFarm?
ไม่ว่าสถานการณ์เฉพาะของคุณจะมีขีด จำกัด เท่าไหร่ใช่เว็บฟาร์มเป็นทางออกที่ดีทางหนึ่งในการปรับขนาด มีสถาปัตยกรรมมากมายสำหรับการบรรลุเป้าหมายนี้ หนึ่งใช้ตัวจัดสรรภาระงาน (ผู้ให้บริการโฮสติ้งสามารถเสนอสิ่งเหล่านี้ได้ แต่สิ่งเหล่านี้มีขีด จำกัด พร้อมกับเพดานแบนด์วิดท์) แต่ฉันไม่ชอบตัวเลือกนี้ สำหรับแอปพลิเคชันหน้าเดียวที่มีการเชื่อมต่อที่ใช้งานได้ยาวนานฉันต้องการที่จะมีรายการเซิร์ฟเวอร์ที่เปิดอยู่ซึ่งแอปพลิเคชันไคลเอนต์จะเลือกจากการสุ่มเมื่อเริ่มต้นระบบและใช้ซ้ำตลอดอายุการใช้งานของแอปพลิเคชัน สิ่งนี้จะลบจุดเดียวของความล้มเหลว (ตัวจัดสรรภาระงาน) และเปิดใช้งานการปรับขนาดผ่านศูนย์ข้อมูลหลายแห่งและทำให้แบนด์วิดท์มากขึ้น
ทำลายตำนาน - พอร์ต 64K
เพื่อตอบคำถามเกี่ยวกับ "64,000" นี่เป็นความเข้าใจที่ผิด เซิร์ฟเวอร์สามารถเชื่อมต่อกับไคลเอนต์มากกว่า 65535 ราย ดู/networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
อย่างไรก็ตาม Http.sys บน Windows อนุญาตให้หลายแอปพลิเคชันแชร์พอร์ตเซิร์ฟเวอร์เดียวกันภายใต้สคีมา HTTP URL พวกเขาแต่ละคนลงทะเบียนการผูกโดเมนแยกกัน แต่ในที่สุดมีแอปพลิเคชันเซิร์ฟเวอร์เดียวที่พร็อกซีคำขอไปยังแอปพลิเคชันที่ถูกต้อง
อัปเดต 2019-05-30
นี่คือการเปรียบเทียบล่าสุดของไลบรารี HTTP ที่เร็วที่สุด - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- วันที่ทดสอบ: 2018-06-06
- ฮาร์ดแวร์ที่ใช้: Dell R440 Xeon Gold + 10 GbE
- ผู้นำมี reponses ข้อความธรรมดา ~ 7M ต่อวินาที (การตอบสนองไม่ใช่การเชื่อมต่อ)
- อันที่สอง Fasthttp สำหรับ golang โฆษณาการเชื่อมต่อพร้อมกัน 1.5M - ดูhttps://github.com/valyala/fasthttp
- ภาษาชั้นนำ ได้แก่ Rust, Go, C ++, Java, C และแม้แต่ C # อันดับที่ 11 (6.9M ต่อวินาที) Scala และ Clojure มีอันดับลดลง Python อยู่ในอันดับที่ 29 ที่ 2.7M ต่อวินาที
- ที่ด้านล่างของรายการฉันสังเกต laravel และ cakephp, ราง, aspnet-mono-ngx, symfony, zend ทั้งหมดต่ำกว่า 10,000 ต่อวินาที โปรดทราบว่าเฟรมเวิร์กเหล่านี้ส่วนใหญ่สร้างขึ้นสำหรับเพจแบบไดนามิกและค่อนข้างเก่าอาจมีตัวแปรใหม่กว่าที่มีคุณสมบัติสูงกว่าในรายการ
- โปรดจำไว้ว่านี่เป็นข้อความธรรมดา HTTP ไม่ใช่สำหรับความสามารถพิเศษของ Websocket: หลายคนที่มาที่นี่น่าจะสนใจการเชื่อมต่อพร้อมกันสำหรับ websocket