การเชื่อมต่อ Socket.IO พร้อมกันสูงสุด


125

คำถามนี้ถูกถามก่อนหน้านี้ แต่ไม่เร็ว ๆ นี้และไม่ได้คำตอบที่ชัดเจน

การใช้ Socket.io มีจำนวนการเชื่อมต่อพร้อมกันสูงสุดที่สามารถรักษาได้ก่อนที่คุณจะต้องเพิ่มเซิร์ฟเวอร์อื่นหรือไม่?

มีใครรู้บ้างไหมว่าสภาพแวดล้อมการผลิตที่ใช้งานอยู่ซึ่งใช้เว็บซ็อกเก็ต (โดยเฉพาะอย่างยิ่ง socket.io) ในขนาดใหญ่ ฉันอยากทราบว่าการตั้งค่าแบบใดที่ดีที่สุดสำหรับการเชื่อมต่อสูงสุด?

เนื่องจาก Websockets ถูกสร้างขึ้นบน TCP ความเข้าใจของฉันก็คือเว้นแต่ว่าพอร์ตจะแชร์ระหว่างการเชื่อมต่อคุณจะถูก จำกัด โดยขีด จำกัด พอร์ต 64K แต่ผมเคยเห็นยังมีรายงานของการเชื่อมต่อโดยใช้ 512K Gretty ผมก็เลยไม่รู้


3
Trelloใช้ซ็อกเก็ตในขนาดใหญ่ (โดยเฉพาะ socket.io)
เจมส์

ฉันอ่านมาว่า Trello ต้องแก้ไขโค้ด Socket.io เนื่องจากจำนวนการเชื่อมต่อ 10,000 และสามารถรักษาการเชื่อมต่อ 'หลายพัน' ก่อนที่จะเพิ่มเซิร์ฟเวอร์ ยังคงเป็นช่องว่างขนาดใหญ่ระหว่างระบบเซิร์ฟเวอร์อื่นถึง 512K
Andrew

1
บทความนั้นเก่าแค่ไหน? Trello เพิ่งมีผู้ใช้งานมากกว่า 1 ล้านคนต่อเดือนดังนั้นฉันคิดว่าพวกเขากำลังใช้งานซ็อกเก็ตที่ใช้งานอยู่มากกว่า 10,000 ซ็อกเก็ต Trello ใช้ Redisนั่งด้านบนของ socket.io เพื่อความยืดหยุ่น
James

2
ตอนนี้ Trello มีผู้ใช้มากกว่า 4 ล้านคน แต่แน่นอนว่าพวกเขากำลังใช้งานบนเซิร์ฟเวอร์จำนวนมากใช่ไหม? นั่นทำให้ฉันกลับไปที่คำถามเดิมของฉัน: จำนวนผู้ใช้พร้อมกันสูงสุดที่แท้จริงของพวกเขา (หรือของใครก็ตาม) ต่อเซิร์ฟเวอร์คืออะไร? นอกจากนี้ยังเป็นการดีที่จะทราบว่าพวกเขาใช้เซิร์ฟเวอร์ / คอนเทนเนอร์ประเภทใด และพวกเขายังคงใช้ส้อมของตัวเองหรือกลับไปยังจุดเริ่มต้น / ต้นแบบ? จุดประสงค์เดียวของฉันในการถามคำถามนี้คือการพยายามวัดว่า บริษัท ของฉัน (ในขณะนั้น) สามารถรักษาแอปพลิเคชัน Socket.io สำหรับการเชื่อมต่อพร้อมกัน 120,000 ครั้งได้หรือไม่
Andrew

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

คำตอบ:


78

บทความนี้อาจช่วยคุณได้: http://drewww.github.io/socket.io-benchmarking/

ฉันสงสัยคำถามเดียวกันดังนั้นฉันจึงเขียนแบบทดสอบเล็ก ๆ (โดยใช้ XHR-polling) เพื่อดูว่าเมื่อใดที่การเชื่อมต่อเริ่มล้มเหลว (หรือล้าหลัง) ฉันพบ (ในกรณีของฉัน) ว่าซ็อกเก็ตเริ่มทำงานที่การเชื่อมต่อพร้อมกันประมาณ 1,400-1800

นี่เป็นส่วนสำคัญสั้น ๆ ที่ฉันทำคล้ายกับการทดสอบที่ฉันใช้: https://gist.github.com/jmyrland/5535279


7
ฉันรู้ว่านี่เป็นหัวข้อที่เก่ากว่า แต่ฉันพบก่อนเมื่อค้นหาคำถามสำหรับคำตอบของฉันและในที่สุดก็พบว่าสิ่งนี้มีประโยชน์: rtcamp.com/tutorials/linux/increase-open-files-limitขีด จำกัด ไฟล์ที่เปิดต่อกระบวนการอาจ ดีฟอลต์เป็น soft limit 1024 และ hard limit ที่ 4096 และเนื่องจากทุกพอร์ต TCP ที่เปิดแสดงถึงไฟล์สิ่งสำคัญคือต้องพิจารณาขีด จำกัด เหล่านี้เมื่อพิจารณาจำนวนซ็อกเก็ตที่เปิดอยู่ที่เครื่องจะอนุญาตก่อนที่จะพยายามใช้ไลบรารีให้สูงสุด
DeeperID

2
@JAM คุณเคยค้นพบไหมว่าทำไมเว็บซ็อกเก็ตของคุณถึงมีการเชื่อมต่อประมาณ 1,400-1,800 ฉันมีปัญหาเหมือนกันและขีด จำกัด ไฟล์ของฉันตั้งไว้ที่ 100,000 ดังนั้นฉันจึงรู้ว่านั่นไม่ใช่ปัญหา ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก. ขอบคุณ.
Seth

@seth: เป็นเวลานานแล้วที่ฉันได้ตรวจสอบสิ่งนี้ครั้งล่าสุด แต่ฉันคิดว่านี่เป็นข้อสรุป: การสำรวจ XHR ใช้ทรัพยากรมากเกินไป (เมื่อเทียบกับวิธีการขนส่งอื่น ๆ ) เมื่อใช้ websockets จำนวนการเชื่อมต่อพร้อมกันจะสูงกว่า
JAM

@JAM ขอบคุณสำหรับคำตอบ ฉันพบปัญหาเดียวกันกับการใช้โมดูล ws ไม่ใช่ socket.io ดังนั้นจึงไม่ควรมีการสำรวจ XHR กับโมดูล ws นั่นคือจุดที่ฉันมีปัญหาในการแก้ไขปัญหา การค้นหายังคงดำเนินต่อไป
Seth

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

16

ฉันพยายามใช้ socket.io บน AWS ฉันสามารถรักษาความเสถียรของการเชื่อมต่อได้ประมาณ 600 ครั้ง

และฉันพบว่าเป็นเพราะ socket.io ใช้การสำรวจระยะยาวก่อนและอัปเกรดเป็น websocket ในภายหลัง

หลังจากที่ฉันตั้งค่า config ให้ใช้ websocket เท่านั้นฉันสามารถเชื่อมต่อได้ประมาณ 9000 ครั้ง

ตั้งค่าการกำหนดค่านี้ที่ฝั่งไคลเอ็นต์:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })

3
คุณใช้ EC2 อินสแตนซ์ประเภทใด t2.micro, t2.nano?
bvdb

2
คุณสังเกตเห็นความแตกต่างในการตอบสนองเมื่อคุณบังคับ websockets หรือไม่?
Lauren

คุณรู้หรือไม่ว่าอินสแตนซ์ของคุณมีขนาดเท่าใด นอกจากนี้ทุกคนในอนาคตจะรู้ว่าเบราว์เซอร์เก่าบางตัวไม่รองรับ WebSockets ซึ่งเป็นสาเหตุที่การอัปเกรดอาจมีความสำคัญสำหรับบางคน
Ryan Soderberg

เราจะทดสอบการเชื่อมต่อที่เซิร์ฟเวอร์รองรับได้อย่างไร? คุณวัดการเชื่อมต่อ 9000 ครั้งได้อย่างไร? ช่วยแนะนำที ..
Curious Developer

15

ดูเหมือนผู้ชายคนนี้จะประสบความสำเร็จในการมีการเชื่อมต่อพร้อมกันมากกว่า 1 ล้านครั้งบนเซิร์ฟเวอร์ Node.js เดียว

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

ยังไม่ชัดเจนสำหรับฉันว่าเขาใช้พอร์ตกี่พอร์ต


13
ไม่ได้อยู่กับ socket.io ฉันคิดว่าและไม่ถึงกับ websockets ผู้ชายคนนี้ดูเหมือนจะใช้การสำรวจระยะยาวซึ่งฉันคิดว่าทรัพยากรน้อย
333

6

สำหรับการเชื่อมต่อพร้อมกัน 300k:

ตั้งค่าตัวแปรเหล่านี้ใน/etc/sysctl.conf:

fs.file-max = 10000000 
fs.nr_open = 10000000

นอกจากนี้เปลี่ยนตัวแปรเหล่านี้ใน/etc/security/limits.conf:

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

และในที่สุดเพิ่มบัฟเฟอร์ TCP /etc/sysctl.confด้วย:

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ https://www.linangran.com/?p=547


วิธีตรวจสอบว่าการเปลี่ยนแปลงของเราใช้งานได้หรือไม่?
Curious Developer

1

หลังจากทำการกำหนดค่าคุณสามารถตรวจสอบได้โดยเขียนคำสั่งนี้บนเทอร์มินัล

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