피드로 돌아가기
The Day the GC Tuning Patch Broke the Leaderboard
Dev.toDev.to
Backend

Rust Bump Allocator 도입을 통한 P99 Latency 112ms에서 6ms로 개선

The Day the GC Tuning Patch Broke the Leaderboard

pretty ncube2026년 5월 27일3advanced

Context

Go 기반 In-memory 리더보드 서비스에서 40MB/s의 쓰레기 처리량 발생 및 GC Pause로 인한 P99 Latency 급증 현상 발생. GOGC 튜닝 시도에도 불구하고 256-byte 단위의 Slice Header 빈번한 할당으로 인한 메모리 팽창과 OOM-killing 한계 직면.

Technical Solution

  • 메모리 관리 주체 변경을 위해 Go에서 Rust(1.75-nightly)로 코어 엔진 전환
  • 개별 Slice 할당 대신 2MB Bump Allocator를 통한 메모리 사전 할당 및 재사용 구조 설계
  • Bump Pointer 리셋 방식을 통한 할당 비용 최소화 및 Deallocation 과정의 No-op 처리 구현
  • jemalloc 도입 및 alloc_profile 분석을 통한 256-byte churn 제거 확인
  • Go API Tier와 Rust Core 간 gRPC 통신 구조 채택 및 Arena Full 대비 Circuit Breaker 기반 Redis Fallback 큐 구축

Impact

  • Latency 개선: P99 112ms → 6ms, P95 42ms → 8ms
  • 메모리 효율: RSS 11GB → 2.1GB로 감소
  • 할당 빈도: Go Heap 1.2M allocs/sec → Rust Arena 0 allocs/sec (Bump only)
  • 하드웨어 효율: Cache Miss율 3.2% → 0.8%로 감소

Key Takeaway

런타임 GC 튜닝으로 해결 불가능한 Cache-line Churn 문제는 언어 차원의 메모리 제어권 확보와 전용 메모리 할당 전략(Custom Arena)으로 해결 가능하다는 설계 원칙 도출.


1. Hot Path 내 Element 할당률이 100k/sec를 초과하는지 확인

2. perf record를 통해 Slice Header나 작은 객체의 빈번한 할당이 Cache Miss의 주원인인지 분석

3. GOGC 튜닝 전 RSS 증가 추이와 GC Pause의 상관관계를 정밀하게 측정

4. 성능 임계치 도달 시 Bump Allocator나 Arena Allocation 적용 검토

원문 읽기