-
10만 유저 동시 접속 가능하게 하기CS/네트워크 2023. 6. 26. 00:01
개요
동시 접속에 대해 이곳저곳 물어보다가 특정 아티클을 추천받게 되었고 이를 읽어보면서 나만의 이해로 다시 정리해보고자 합니다.
https://shdkej.com/blog/100k_concurrent_server/
소켓, 포트, 커넥션 너는 무엇인가?
포트는 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/
'CS > 네트워크' 카테고리의 다른 글
네트워크 Timeout에 대처하는 방법 (0) 2024.01.07 HTTP/TCP 지연과 성능개선법 (0) 2023.08.13 CLOSE_WAIT 과 TIME_WAIT (0) 2023.06.25 세션 하이재킹과 TCP Sequence Number (0) 2022.07.28 ICMP 프로토콜이란? (0) 2022.07.22