피드로 돌아가기
Why Hytale Treasure Hunt Servers Throttle at 100 Players (And How We Fixed It)
Dev.toDev.to
Backend

Rust 전환으로 GC Pause 110ms를 0.8ms로 단축하여 200명 이상의 동접자 수용

Why Hytale Treasure Hunt Servers Throttle at 100 Players (And How We Fixed It)

pretty ncube2026년 5월 27일4advanced

Context

Go 런타임의 GC Pause와 스케줄러 오버헤드로 인한 50ms Tick Budget 위반 문제 발생. 100명 이상의 동시 접속 시 P99 Latency가 1.4s까지 치솟으며 패킷 손실 22% 및 상태 불일치 현상 초래.

Technical Solution

  • GC Determinism 확보를 위해 Go에서 Rust(Tokio 1.25)로 언어 런타임 전면 교체
  • Mutex 기반 맵을 DashMap으로 변경하여 Sharded Treasure Table 구조 설계 및 락 경합 최소화
  • Go의 M:N 스케줄링 모델을 제거하고 Core 2-5에 고정된 4개의 Worker Thread로 구동하는 Tokio Work-stealing 스케줄러 도입
  • per-player Ring Buffer를 Zero-length mpsc channel로 대체하여 수신측 처리 속도에 맞춘 배압(Backpressure) 제어 구현
  • Arc 구조를 통한 Zero-cost Abstraction 적용 및 동적 스택 성장으로 인한 메모리 오버헤드 제거

Impact

  • Latency 개선: P99 1.4s(Go) $\rightarrow$ 46ms(Rust) 및 최악의 Tick 지연시간 110ms $\rightarrow$ 0.8ms로 감소
  • 처리량 증대: 시스템 붕괴 지점 130 RPS $\rightarrow$ 220 RPS로 확장
  • 리소스 효율: 180 RPS 기준 CPU 사용률 98% $\rightarrow$ 60%(User 42%, System 18%)로 최적화
  • 메모리 안정성: steady state 할당량 4.8 MB/sec $\rightarrow$ 312 KB/sec로 급감

Key Takeaway

실시간성(Real-time)이 핵심인 게임 상태 레이어에서는 단순 처리 속도보다 GC Pause와 같은 Tail Latency의 결정론적 제어가 더 중요함. 런타임 스케줄러의 컨텍스트 스위칭 비용이 비즈니스 로직의 시간 예산을 초과할 경우, 언어 차원의 패러다임 전환이 유일한 해결책이 될 수 있음.


- 엄격한 응답 시간 제한(예: 50ms 미만)이 있는 시스템 설계 시 런타임 GC Pause 영향도 사전 프로파일링 수행 - 고빈도 업데이트가 발생하는 공유 상태 테이블 설계 시 Sharded Hash Map 도입 검토 - 무제한 버퍼링 채널 대신 Bounded Channel 또는 Zero-length Channel을 통한 배압 전략 수립 - Green Thread의 과도한 생성이 스케줄러 오버헤드로 이어지는지 pprof 등을 통해 검증

원문 읽기