CS/네트워크

10만 유저 동시 접속 가능하게 하기

Junuuu 2023. 6. 26. 00:01

개요

동시 접속에 대해 이곳저곳 물어보다가 특정 아티클을 추천받게 되었고 이를 읽어보면서 나만의 이해로 다시 정리해보고자 합니다.

https://shdkej.com/blog/100k_concurrent_server/

 

10만 유저 동시 접속 가능하게 하기

⚠️ 이 글은 의식의 흐름대로 작성되었습니다. 한 대의 PC로 10만 접속자 유지가 가능한가 (에코 서버의 경우) 안된다면 최소 몇대의 PC가 필요한가 (사양) 왜 10만인가 토트넘 경기 SPOTV 유튜브 동

shdkej.com

 

소켓, 포트, 커넥션 너는 무엇인가?

포트는 tcp connection spec에서 16bit으로 정의되어 있기 때문에 0~65535까지 열릴 수 있습니다.

 

커넥션은 발신지 IP:PORT와 수신지 IP:PORT를 가진것을 말합니다.

 

만약 수신지가 한 곳이라면 예를들어 서버의 80 포트가 수신지라면!

클라이언트 한 대에서 커넥션은 65535개가 한계입니다.

 

반면 서버의 경우에는 클라이언트와 다르게 65535 커넥션 이상을 받을 수 있습니다.

 

그러면 10만 유저를 동시에 받아들인다는 것은 10만개의 소켓을 열고 유지하는 게 가능해야 합니다.

클라이언트에서는 하나의 포트에 하나의 소켓을 할당해서 접속하지만, 서버는 하나의 포트에 여러 소켓을 열어 접속을 받습니다.

 

 

100,000만 유저 load Test

- 목표: 동시에 십만 유저의 접속하는 상황에서 반응 속도 및 정상 동작 확인

- 조건: 동시에 십만 Connection이 유지되어야 한다

 

테스트

- 에코를 잘 반환하는지 테스트 (에코란 서버가 클라이언트의 요청을 그대로 반환)

- 비디오 10초 정도를 잘 재생 후 정상 리턴하는지 테스트

 

유저별 진행상황

5000명 : cpu 풀로 사용하지 않음

10000명: 무난하다, unlimit만 풀어준다. (unlimit은 user limit을 줄인 단어로, 사용자가 실행시키는 프로세스의 자원 제한 설정입니다)

15000명: 접속이 씹힌다.

20000명: 접속이 씹혀서 5000명씩 4번 접속하도록 하니 2만 접속 확인이 되었다. TIME_WAIT를 기다린다고 씹히는 것 같다.

30000명: connection reset by peer 에러 발생(서버에서 입력을 받는 커넥션을 shutdown 해서 끊었다는 뜻, 닫힌 커넥션에 다시 데이터를 보내서 발생) ->   nginx를 활용하니 3만~4만 처리가 가능

50000명: i/o timeout 발생, cpu의 한계 같음

10만 명: nodejs로 연결자체는 성공했는데 실제 접속자가 그만큼 되었는지 알 수 없다 -> 쿠버네티스로 테스트

 

서버에서 클라이언트 접속 10초 유지테스트

- websocket으로 50000명 성공(메모리 3기가 사용)

- 51,000에서 cannot assign requested address 소켓이 부족해서 발생

- 10만 명은 어떻게 하지? 그리고 다른 레퍼런스들에서 120만 명 연결, 100만 명 연결 이건 뭐지?

- 로컬에서 ip를 할당해서 로드밸런서를 분산하면 된다

- 또는 서버의 port를 여러 개 리슨 하도록 한다 예를 들어 서버에 200개의 포트를 열어두면 200 * 50000으로 1000만 개의 request를 받을 수 있다.

- 이렇게 되면 메모리량만큼 한 PC에서 접속을 허용할 수 있다.

 

 

 

 

 

 

참고자료

https://shdkej.com/blog/100k_concurrent_server/

 

10만 유저 동시 접속 가능하게 하기

⚠️ 이 글은 의식의 흐름대로 작성되었습니다. 한 대의 PC로 10만 접속자 유지가 가능한가 (에코 서버의 경우) 안된다면 최소 몇대의 PC가 필요한가 (사양) 왜 10만인가 토트넘 경기 SPOTV 유튜브 동

shdkej.com