피드로 돌아가기
Dev.toBackend
원문 읽기
Go GC 병목 해결을 위한 Rust 도입으로 p99 지연시간 14ms 달성
Rust Was the Constraint: How We Discovered the Language Was Our Scaling Bottleneck
AI 요약
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 전송 방식을 통해 직렬화/역직렬화 비용 최소화