피드로 돌아가기
Dev.toBackend
원문 읽기
Goroutine 수를 줄여 처리량 40배 향상시킨 Worker Pool 최적화 전략
Go Concurrency Hack to Handle 1M Requests/Second
AI 요약
Context
요청당 Goroutine을 1:1로 생성하는 Naive 방식 채택. Black Friday 트래픽 증가 시 80만 개 이상의 Goroutine 생성으로 인한 메모리 고갈 발생. 12GB RAM 소모 및 서비스 크래시로 이어진 시스템 한계.
Technical Solution
- 고정된 수의 Goroutine이 작업을 처리하는 Worker Pool 패턴 도입
- Goroutine 생성 비용과 Context Switching 오버헤드를 줄이는 작업 중심의 아키텍처 전환
- (CPU Cores × 2) + Blocked I/O 연산 수 기반의 최적 Worker 수 산출 공식 적용
- Producer 블로킹 방지를 위해 Worker 수의 5~10배 크기로 Task Queue 버퍼 설정
- TrySubmit 메서드를 통한 큐 오버플로 방지 및 Graceful Degradation 설계
- 큐 길이와 CPU 사용률을 모니터링하여 Worker 수를 조정하는 동적 스케일링 전략
Impact
- RAM 사용량 2.1GB에서 247MB로 85% 절감
- 처리량(Throughput) 40배 향상
- 초당 100만 건 이상의 요청 처리 및 P99 Latency 10ms 미만 달성
Key Takeaway
제약 조건이 성능을 만든다는 원칙 하에 동시성 수준을 제한함으로써 리소스 예측 가능성과 시스템 처리량을 동시에 확보한 사례.
실천 포인트
I/O 집약적 서비스의 경우 Worker 수를 CPU Core의 2~4배로 설정하고 벤치마크를 통해 최적 지점을 찾을 것