Reddit

Just finished my multiplayer system in C and turns out we can support 50k players in a single server at 60hz simulation tick

C로 만든 멀티플레이어 시스템, 단일 서버에서 5만 명을 60Hz로 시뮬레이션

개발자는 AWS 96 vCPU 서버에서 5만 개의 QUIC 클라이언트를 연결하고 60Hz 시뮬레이션을 실행했다고 밝혔습니다. 다만 부하는 주로 캐릭터 이동에 한정되며, 서버가 포화되자 클라이언트 갱신 빈도는 초당 약 16회로 떨어졌습니다.

에디터 노트

이번 수치가 보여주는 범위는 5만 개 연결에서의 네트워크 처리와 이동 시뮬레이션입니다. 작성자는 서버가 입력을 받아 권위 상태를 계산하고 관련성 단계와 델타 스냅샷을 처리한다고 설명했으므로 단순 패킷 중계라는 평가는 맞지 않습니다. 반면 5만 명 부하에서 클라이언트 갱신은 초당 약 16회로 줄었고, 데모에는 치트 방지와 지연 보정이 포함되지 않았습니다. 상호작용과 충돌, 전투가 추가된 게임에서도 같은 규모가 유지된다는 근거는 아직 제시되지 않았습니다. 댓글에서 제기된 합성 부하와 실제 클라이언트 간 차이, 96 vCPU 서버의 비용과 규모, 게임 로직 추가에 따른 연산량은 이 결과를 제품 성능으로 일반화하기 어렵게 하는 구체적인 조건입니다. 작성자도 1만 명 규모의 Fortnite식 게임플레이는 불가능하지 않다고 했을 뿐 이를 입증한 것은 아닙니다. 따라서 성과를 평가할 기준은 최대 연결 수 하나가 아니라 게임 규칙과 전송 주기를 유지하면서 어느 정도 규모까지 성능이 확장되는지입니다.

AI 요약

C로 멀티플레이어 엔진을 개발한 Reddit 작성자가 5만 명 규모의 네트워크 스트레스 테스트 결과와 아키텍처를 공개했습니다. 테스트 영상에는 캐릭터들이 이동하는 장면이 담겼으며, 세부 수치와 구현 방식은 Reddit 댓글에서 설명했습니다.

서버와 시뮬레이션

테스트 서버는 AWS c8gn.24xlarge 인스턴스입니다. 작성자는 Graviton4 기반 96 vCPU 가운데 88개 실행 레인을 사용했고, 네 대의 부하 생성 장비에서 각각 1만 2,500개씩 총 5만 개의 실제 연결 클라이언트를 붙였습니다. 모든 캐릭터는 키네마틱 캐릭터 컨트롤러로 움직입니다. 서버와 클라이언트가 같은 시뮬레이션을 실행하고, 서버가 권위 있는 상태를 유지합니다. 클라이언트는 위치가 아니라 입력을 전송하며, 서버 상태와 차이가 생기면 클라이언트가 롤백 후 재시뮬레이션합니다.

서버 시뮬레이션 주기는 60Hz입니다. 다만 5만 명 부하에서는 서버가 포화되어 프레임마다 두 번 시뮬레이션을 수행하고, 클라이언트에 보내는 상태 갱신은 초당 약 16회로 감소했습니다. 4만 명까지는 플레이어 1,000명 증가당 서버 프레임 시간이 0.36ms 늘어나는 선형 확장세를 보였지만, 5만 명에서는 선형성이 깨졌습니다.

상태 복제와 네트워크

네트워크 아키텍처는 ECS(Entity-Component-System) 기반입니다. 네트워크 전송 대상으로 표시한 ECS 컴포넌트를 복제하며, 필드별로 양자화하고 직렬화 코드는 자동 생성합니다. 예를 들어 위치 정밀도는 1mm 단위입니다. 클라이언트 입력 패킷은 최근 4개 틱의 입력을 함께 담아 패킷 손실을 보완합니다. 전송 계층은 UDP 위의 QUIC이며, 다른 전송 계층으로 교체할 수 있도록 설계했습니다.

클라이언트별 관련성(relevancy)은 세 단계로 나눕니다. 가까운 플레이어 256명은 초당 30회 갱신하고, 64m 안쪽의 나머지 플레이어는 엔티티당 약 3바이트를 초당 5회 전송합니다. 그 밖의 플레이어는 클라이언트에서 이동을 추정하며 약 7비트 단위 정보를 초당 한 번 받습니다. 중간 및 원거리 단계의 데이터는 맵 타일별로 한 번 인코딩해 여러 클라이언트가 공유합니다. 클라이언트당 대역폭은 중앙값 초당 18KB, 99백분위 초당 68KB라고 밝혔습니다.

Reddit 반응

  • @pokeybill — 이 규모에서 시뮬레이션한 추정치는 실제 서버 크기와 엔티티 행동을 반영하면 무너집니다. 플레이어와 엔티티 사이의 의미 있는 상호작용이 부족하고, 추적하고 공유할 게임 상태가 늘면 1만 명도 빠르게 의심스러운 목표가 됩니다.
  • @bwainfweeze — 합성 부하는 실제 클라이언트와 다르게 동작하기 쉽습니다. 커널과 이더넷 카드가 처리하는 방식 때문에 데이터가 의도보다 질서 있게 도착할 수도 있습니다. 좋은 스트레스 테스트는 여러 장비를 함께 써서 이 문제와 대역폭 부족을 다룹니다.
  • @dechichi — 이 엔진은 2024년부터 C로 개발했으며, 네트워크 구조는 2017년 GDC 강연에서 영감을 얻었습니다. 데모에는 큰 상호작용이 없지만, 별도의 동등한 데모를 만들어 시험하는 중입니다.
  • @-Hi-Reddit — 가까운 256명과 64m 기준의 관련성 단계는 100m 거리까지 볼 수 있는 FPS 게임에는 실용적이지 않습니다. 게임 시스템을 추가하면 전송량이 훨씬 커지므로 1만 명 대신 1,000명을 추정치로 잡는 편이 낫습니다.
  • @dechichi — 목표를 1만 명으로 잡고 도달하지 못해 답답해하는 편을 선호합니다. 1,000명을 목표로 잡고 거기서 멈추는 것보다 더 멀리 갈 수 있습니다.
  • @anengineerandacat — 96 vCPU 서버는 상당히 큰 장비입니다. 더 보편적인 16 또는 32 vCPU 장비에서도 성능이 궁금합니다. 충돌 없는 이동만으로는 실제 게임의 물리, 롤백, 사격, 범위 공격 부하를 알기 어렵습니다.
  • @dechichi — 데모에는 아직 치트 방지 시스템이 없고 지연 보정도 실행하지 않습니다. 지연 보정은 사격 판정 검증에 선택적으로 쓰는 기능이라고 설명했습니다.

원문: YouTube 영상 및 Reddit 작성자 댓글 / 번역·요약: Trawling