최대 동시 Socket.IO 연결


123

이 질문은 이전에 질문되었지만 최근에는 없었으며 명확한 답변이 없습니다.

Socket.io를 사용하면 다른 서버를 추가하기 전에 유지할 수있는 최대 동시 연결 수가 있습니까?

웹 소켓 (특히 socket.io)을 대규모로 사용하는 활성 프로덕션 환경을 아는 사람이 있습니까? 최대 연결을 위해 어떤 종류의 설정이 가장 적합한 지 알고 싶습니다.

Websocket은 TCP를 기반으로 구축 되었기 때문에 연결간에 포트를 공유하지 않는 한 64K 포트 제한에 의해 제한 될 것임을 이해합니다. 하지만 Gretty를 사용 하는 512K 연결에 대한 보고서도 보았습니다 . 그래서 모르겠습니다.


3
Trello 는 대규모로 소켓을 사용합니다 (특히 socket.io).
James

나는 Trello가 10,000 개의 연결 제한 때문에 Socket.io 코드를 수정해야하고 서버를 추가하기 전에 '수천'개의 연결을 유지할 수 있었다고 읽었습니다. 여전히 512K의 다른 서버 시스템과 큰 차이가 있습니다.
Andrew

1
그 기사는 몇 살입니까? Trello는 최근 한 달에 1 백만 명 이상의 활성 사용자에게 도달했기 때문에 현재 10,000 개 이상의 활성 소켓을 실행하고 있다고 생각합니다. 레디 스를 사용 Trello 확장 성을 socket.io의 상단에 앉아
제임스

2
Trello는 현재 4 백만 명 이상의 사용자를 보유하고 있지만 확실히 많은 서버에서 실행하고 있습니다. 그러면 원래 질문으로 돌아갑니다. 서버 당 실제 최대 동시 사용자 수는 얼마입니까? 어떤 종류의 서버 / 컨테이너를 사용하는지 아는 것도 좋습니다. 그리고 그들은 여전히 ​​자신의 포크를 실행하고 있습니까, 아니면 오리진 / 마스터로 돌아가고 있습니까? 이 질문에 대한 나의 유일한 목적은 내 회사 (당시)가 아마도 120,000 개의 동시 연결에 대해 Socket.io 응용 프로그램을 유지할 수 있는지 측정하는 것입니다.
Andrew

1
포트 제한에 관해서는 왜 문제가되지 않는지에 대한 설명이 여기에 설명되어 있다고 생각합니다 . 기본적으로 시스템에서 사용되는 유일한 포트는 청취중인 포트입니다. 소켓은 각 연결에 대해 생성되고 파일 설명자를 사용하지만 상자의 포트를 사용하지 않습니다.
Paul Lynch

답변:


77

이 기사가 도움이 될 것입니다 : http://drewww.github.io/socket.io-benchmarking/

같은 질문이 궁금해서 연결이 실패 (또는 뒤처짐)가 시작된시기를 확인하기 위해 작은 테스트 (XHR 폴링 사용)를 작성했습니다. 내 경우에는 소켓이 약 1400-1800 동시 연결에서 작동하기 시작했습니다.

이것은 내가 사용한 테스트와 유사한 짧은 요점입니다 : https://gist.github.com/jmyrland/5535279


7
나는 이것이 오래된 주제라는 것을 알고 있지만 내 대답에 대한 질문을 검색 할 때 처음 발견했고 궁극적으로 이것이 도움이된다는 것을 발견했습니다. rtcamp.com/tutorials/linux/increase-open-files-limit 프로세스 당 열린 파일 제한은 기본적으로 1024의 소프트 제한과 4096의 하드 제한으로 설정되어 있으며 열려있는 모든 TCP 포트가 파일을 나타내므로 라이브러리를 최대로 사용하기 전에 시스템에서 허용 할 열린 소켓 수를 결정할 때 이러한 제한을 고려하는 것이 중요합니다.
DeeperID

2
@JAM 웹 소켓이 1400-1800 연결에서 작동하는 이유를 발견 했습니까? 동일한 문제가 발생하고 파일 제한이 100,000으로 설정되어 있으므로 문제가되지 않는다는 것을 알고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사합니다.
Seth

@seth : 마지막으로 검토 한 지 오래되었지만 결론이라고 생각합니다. XHR 폴링이 다른 전송 방법과 관련하여 너무 많은 리소스를 차지했습니다. 웹 소켓을 사용할 때 동시 연결 수가 더 많았습니다.
JAM

@JAM 답변 주셔서 감사합니다. socket.io가 아닌 ws 모듈을 사용하여 동일한 문제가 발생하므로 ws 모듈에 대한 XHR 폴링이 없어야합니다. 여기서 문제를 해결하는 데 문제가 있습니다. 검색이 계속됩니다.
Seth

이것은 좋은 깨끗한 대답입니다 .. 또한 경우에 따라 정확합니다 .. 개인적으로 나는 ppl이 자신의 벤치 마크 또는 연결 시뮬레이터를 작성하는 것이 좋습니다. 다른 사람에 대한 테스트는 좋지만 실제 환경을 나타내지는 않습니다. 다양한 실제 결함이있는 클라이언트 수에 관계없이 처리 할 수있는 클라이언트 시뮬레이터가 있으면 큰 변경 후 벤치 마크를 수행 할 수 있습니다. 이동하면서 시뮬레이터를 업데이트하십시오. 사용자 채팅 인터페이스를 운영하는 것은 사용자 브라우저 등을 모니터링하는 것과 다를 것입니다. Python 시뮬레이터 스크립트를 작성하는 것이 매우 편리하다는 것을 알았습니다.
Angry 84

16

AWS에서 socket.io를 사용하려고했지만 최대 약 600 개의 연결을 안정적으로 유지할 수 있습니다.

그리고 socket.io가 먼저 긴 폴링을 사용하고 나중에 websocket으로 업그레이드했기 때문이라는 것을 알았습니다.

websocket 만 사용하도록 구성을 설정 한 후에는 약 9000 개의 연결을 유지할 수 있습니다.

클라이언트 측에서이 구성을 설정하십시오.

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

2
EC2를 사용 했습니까? 어떤 종류의 인스턴스입니까? t2.micro, t2.nano?
bvdb

2
웹 소켓을 강제 할 때 반응 속도의 차이를 발견 했습니까?
Lauren

인스턴스의 크기를 알고 있습니까? 또한 미래의 모든 사람들은 일부 오래된 브라우저가 WebSocket을 지원하지 않는다는 것을 알고 있으므로 일부 사용자에게는 업그레이드가 중요 할 수 있습니다.
Ryan Soderberg

서버가 얼마나 많은 연결을 지원하는지 어떻게 테스트 할 수 있습니까? 9000 개의 연결을 어떻게 측정 했습니까? ..
Curious Developer

15

이 사람은 단일 Node.js 서버에서 1 백만 개 이상의 동시 연결을 성공한 것으로 보입니다.

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

그래도 그가 얼마나 많은 포트를 사용하고 있는지 정확히 알 수 없습니다.


13
socket.io가 아니라고 생각하며 웹 소켓도 아닙니다. 그 사람은 내가 생각하기에 자원이 덜 배고픈 긴 폴링을 사용하는 것 같습니다.
Tim 333

6

+30 만 동시 연결의 경우 :

다음에서 이러한 변수를 설정하십시오 /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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.