Kết nối Socket.IO đồng thời tối đa


123

Câu hỏi này đã được hỏi trước đây nhưng không phải gần đây và không có câu trả lời rõ ràng.

Sử dụng Socket.io, có số lượng kết nối đồng thời tối đa mà người ta có thể duy trì trước khi bạn cần thêm một máy chủ khác không?

Có ai biết bất kỳ môi trường sản xuất đang hoạt động nào đang sử dụng websockets (đặc biệt là socket.io) trên quy mô lớn không? Tôi thực sự muốn biết loại thiết lập nào là tốt nhất cho các kết nối tối đa?

Vì Websockets được xây dựng dựa trên TCP, nên tôi hiểu rằng trừ khi các cổng được chia sẻ giữa các kết nối, bạn sẽ bị ràng buộc bởi giới hạn cổng 64K. Nhưng tôi cũng đã thấy các báo cáo về các kết nối 512K bằng Gretty . Vì vậy, tôi không biết.


3
Trello sử dụng ổ cắm trên quy mô lớn (cụ thể là socket.io).
James

Tôi đọc được rằng Trello phải sửa đổi mã Socket.io vì có 10.000 kết nối và có thể duy trì 'hàng ngàn kết nối trước khi thêm máy chủ. Vẫn còn một khoảng cách lớn giữa đó và 512K của các hệ thống máy chủ khác.
Andrew

1
Bài báo đó bao nhiêu tuổi? Trello gần đây đã đạt được hơn 1 triệu người dùng hoạt động mỗi tháng vì vậy tôi sẽ tưởng tượng họ hiện đang chạy hơn 10.000 ổ cắm hoạt động. Trello sử dụng Redis để ngồi trên socket.io cho khả năng mở rộng
James

2
Trello hiện rõ ràng có hơn 4 triệu người dùng, nhưng chắc chắn họ đang chạy nó trên một số lượng lớn máy chủ, phải không? Điều đó đưa tôi trở lại câu hỏi ban đầu của tôi: số lượng người dùng đồng thời cao nhất thực tế của họ (hoặc của bất kỳ ai khác) trên mỗi máy chủ? Cũng tốt để biết họ sử dụng loại máy chủ / container nào. Và họ vẫn đang chạy ngã ba của riêng họ, hay họ quay trở lại nguồn gốc / chủ? Mục đích duy nhất của tôi khi đặt câu hỏi này là cố gắng đánh giá xem công ty của tôi (vào thời điểm đó) có đủ khả năng duy trì ứng dụng Socket.io cho khoảng 120.000 kết nối đồng thời hay không.
Andrew

1
Về giới hạn cổng, tôi nghĩ rằng lời giải thích tại sao đó không phải là vấn đề được giải thích ở đây . Về cơ bản, cổng duy nhất được sử dụng trên hệ thống của bạn là cổng mà bạn đang nghe. Các socket được tạo cho mỗi kết nối và chúng sử dụng các mô tả tệp, nhưng chúng không sử dụng các cổng trên hộp của bạn.
Paul Lynch

Câu trả lời:


77

Bài viết này có thể giúp bạn trên đường đi: http://drewww.github.io/socket.io-benchmarking/

Tôi đã tự hỏi cùng một câu hỏi, vì vậy cuối cùng tôi đã viết một bài kiểm tra nhỏ (sử dụng bỏ phiếu XHR) để xem khi nào các kết nối bắt đầu không thành công (hoặc tụt lại phía sau). Tôi thấy (trong trường hợp của tôi) rằng các ổ cắm bắt đầu hoạt động ở khoảng 1400-1800 kết nối đồng thời.

Đây là một ý chính ngắn mà tôi đã thực hiện, tương tự như bài kiểm tra tôi đã sử dụng: https://gist.github.com/jmyrland/5535279


7
Tôi nhận ra đây là một chủ đề cũ hơn nhưng tôi đã tìm thấy nó đầu tiên khi tìm kiếm câu hỏi cho câu trả lời của mình và cuối cùng phát hiện ra điều này hữu ích: rtcamp.com/tutorials/linux/increas-open-files-limit Giới hạn tệp mở cho mỗi quy trình có thể mặc định ở giới hạn mềm là 1024 và giới hạn cứng là 4096 và vì mỗi cổng TCP mở đại diện cho một tệp, điều quan trọng là phải xem xét các giới hạn này khi xác định số lượng ổ cắm mở mà máy sẽ cho phép trước khi cố gắng tối đa hóa thư viện.
DeeperID

2
@JAM Bạn đã bao giờ khám phá lý do tại sao các ổ cắm web của bạn hoạt động khoảng 1400-1800 kết nối chưa? Tôi đang gặp vấn đề giống hệt nhau và giới hạn tệp của tôi được đặt thành 100.000, vì vậy tôi biết đó không phải là vấn đề. Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn bạn.
Seth

@seth: đã được một thời gian kể từ lần cuối tôi xem xét điều này, nhưng tôi nghĩ đây là kết luận: việc bỏ phiếu XHR chiếm quá nhiều tài nguyên (liên quan đến các phương thức vận chuyển khác). Khi sử dụng websockets, số lượng kết nối đồng thời cao hơn.
JAM

@JAM cảm ơn bạn đã trả lời. Tôi đang thấy các vấn đề tương tự khi sử dụng mô-đun ws, không phải socket.io, vì vậy không nên có bất kỳ cuộc thăm dò XHR nào với mô-đun ws. Đó là nơi tôi gặp sự cố. Cuộc tìm kiếm vẫn tiếp tục.
Seth

Đây là một câu trả lời rõ ràng tốt .. Cũng đúng như từng trường hợp .. Cá nhân tôi đề nghị ppl viết điểm chuẩn của riêng họ hoặc giả lập kết nối. Mặc dù thử nghiệm cho người khác có thể tốt, nhưng nó không đại diện cho môi trường thế giới thực ... Một khi bạn có một trình giả lập máy khách có khả năng xử lý bất kỳ số lượng khách hàng nào với các lỗi trong thế giới thực khác nhau .. Bạn có thể đánh dấu điểm sau những thay đổi lớn và cả cập nhật giả lập của bạn khi bạn đi. Vận hành giao diện trò chuyện của người dùng sẽ khác với giám sát trình duyệt của người dùng, v.v. Python tôi thấy rất tiện để tạo kịch bản giả lập ...
Angry 84

16

Tôi đã thử sử dụng socket.io trên AWS, nhiều nhất tôi có thể giữ khoảng 600 kết nối ổn định.

Và tôi phát hiện ra điều đó là do socket.io đã sử dụng bỏ phiếu dài trước và nâng cấp lên websocket sau đó.

sau khi tôi đặt cấu hình chỉ sử dụng websocket, tôi có thể giữ khoảng 9000 kết nối.

Đặt cấu hình này ở phía máy khách:

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

2
bạn đã sử dụng EC2, loại ví dụ nào? t2.micro, t2.nano?
bvdb

2
Bạn có nhận thấy sự khác biệt về khả năng phản hồi khi bạn buộc websockets không?
Lauren

Bạn có biết kích thước cá thể của bạn là gì không? Ngoài ra, để mọi người trong tương lai biết một số trình duyệt cũ không hỗ trợ WebSockets, đó là lý do tại sao việc nâng cấp có thể quan trọng đối với một số người.
Ryan Soderberg

Làm thế nào chúng ta có thể kiểm tra bao nhiêu kết nối mà máy chủ hỗ trợ? Làm thế nào bạn đo được 9000 kết nối? Vui lòng đề xuất ..
Nhà phát triển tò mò

14

Anh chàng này dường như đã thành công khi có hơn 1 triệu kết nối đồng thời trên một máy chủ Node.js.

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

Tôi không rõ chính xác có bao nhiêu cổng anh ta đang sử dụng.


13
Không phải với socket.io tôi nghĩ và thậm chí không có websockets. Anh chàng dường như đang sử dụng cuộc bỏ phiếu dài mà tôi đoán là ít đói tài nguyên hơn.
Tim 333

6

Đối với kết nối đồng thời + 300k:

Đặt các biến này trong /etc/sysctl.conf:

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

Ngoài ra, thay đổi các biến này trong /etc/security/limits.conf:

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

Và cuối cùng, cũng tăng bộ đệm 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

để biết thêm thông tin, vui lòng tham khảo https://www.linangran.com/?p=547


Làm thế nào để kiểm tra xem những thay đổi của chúng tôi có hoạt động không?
Nhà phát triển tò mò
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.