피드로 돌아가기
Rust Was the Constraint: How We Discovered the Language Was Our Scaling Bottleneck
Dev.toDev.to
Backend

Go GC 병목 해결을 위한 Rust 도입으로 p99 지연시간 14ms 달성

Rust Was the Constraint: How We Discovered the Language Was Our Scaling Bottleneck

pretty ncube2026년 5월 27일4advanced

Context

Go 1.21 기반 3계층 마이크로서비스 구조에서 5만 동시 접속 처리 시 GC jitter로 인한 p99 지연시간 80ms 초과 발생. 7.6GB 힙 메모리 중 실제 객체는 1.4GB에 불과하며, 메모리 단편화와 Go 런타임의 GC pacing 제어 한계로 인한 성능 저하 직면.

Technical Solution

  • GC 및 Stop-the-world 제거를 위해 핵심 Move-dispatcher 레이어를 Rust 기반의 'IronHoard' 서비스로 전면 교체
  • Lock-free MPSC channel과 Custom Arena Allocator 조합을 통한 메모리 할당 지연시간 최소화
  • 24코어 tokio 런타임 및 Sharded work-stealing scheduler를 적용한 고효율 병렬 처리 구조 설계
  • Go 레이어와의 통신을 위해 Boringtun 기반 Zero-copy framing 및 Shared Memory gRPC 도입으로 오버헤드 제거
  • Bump-pointer region 기반의 std::alloc::Allocator 적용을 통한 Vec::reserve의 지수적 증가 버그 해결 및 메모리 단편화 방지

1. pprof 분석 시 wall time의 상당 부분이 GC sweep/mark 단계에 집중되는지 확인

2. GOGC, GOMEMLIMIT 튜닝 후에도 Tail Latency가 개선되지 않는다면 런타임 자체의 제약 가능성 검토

3. 고빈도 할당/해제가 발생하는 Hot Path에는 Custom Arena Allocator 도입 고려

4. 이기종 언어 간 통신 시 Zero-copy 전송 방식을 통해 직렬화/역직렬화 비용 최소화

원문 읽기