피드로 돌아가기
Dev.toBackend
원문 읽기
Rust Bump Allocator 도입을 통한 P99 Latency 112ms에서 6ms로 개선
The Day the GC Tuning Patch Broke the Leaderboard
AI 요약
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 적용 검토