피드로 돌아가기
Dev.toBackend
원문 읽기
Go에서 Rust 전환을 통한 메모리 96% 절감 및 P99.99 지연시간 0.8ms 달성
The Night Our Event Pipeline Crashed Because We Didn't Measure Memory First
AI 요약
Context
Go 기반 Event Ingestion Pipeline에서 중첩 구조의 메타데이터로 인한 Heap 메모리 과다 할당 발생. 32GB RAM 한계치 초과 및 최대 200ms의 GC Pause로 인해 이벤트 유실이 발생하는 시스템 병목 지점 확인.
Technical Solution
- 불필요한 780 bytes/event 할당 제거를 위해 Go에서 Rust로 프로세서 재작성
- Contention 감소를 목적으로 Tokio Runtime의 Work-stealing Scheduler 비활성화
- Arc 도입을 통한 메타데이터 공유 구조 설계로 메모리 할당 68% 절감
- 메모리 증가 억제를 위해 crossbeam-channel 기반의 1024 사이즈 Bounded Queue 적용
- P99.99 2ms SLA 준수를 위해 serde_json 대신 memchr 및 itoa를 활용한 Raw Parsing 구현
Impact
- 메모리 사용량: 4.2GB → 1.2GB로 감소 (동일 1,800만 이벤트 기준)
- 지연시간: P99.99 기준 2.4ms → 0.8ms로 개선
- 리소스 비용: 인스턴스 사양 하향(c6g.4xlarge → c6g.2xlarge)을 통한 클라우드 비용 40% 절감
- 시스템 효율: Cache Miss 2.3배 감소 및 jemalloc 기반 메모리 단편화 제로 달성
실천 포인트
- 메모리 부족 발생 시 Concurrency 조정 전 Valgrind Massif 등을 통해 실제 할당 패턴 분석 - Hot Path 내 임시 슬라이스 생성 및 직렬화 비용이 성능 병목의 핵심 원인인지 검토 - 생산성이 중요한 API 계층과 메모리 효율이 중요한 Hot Path를 분리하여 언어별 최적 전략 적용