피드로 돌아가기
Hacker NewsInfrastructure
원문 읽기
Unbounded Concurrency로 인한 Port Exhaustion 및 Death Spiral 해결
Bluesky April 2026 Outage Post-Mortem
AI 요약
Context
Scylla DB 부하 경감을 위해 memcached를 활용하는 Data Plane 구조 운용 중 특정 RPC의 동시성 제어 부재로 인한 시스템 붕괴 발생. 특히 Batch 요청 크기에 대한 제약 없는 Goroutine 생성 방식이 TCP 연결 자원 고갈의 원인이 됨.
Technical Solution
- GetPostRecord 엔드포인트에 errgroup.SetLimit을 도입하여 Goroutine 생성 개수를 제한하는 Bounded Concurrency 적용
- 대규모 Batch 요청(최대 20,000개 URI) 시 발생하는 과도한 TCP 연결 생성 및 TIME_WAIT 상태의 Port 고갈 문제 해결
- Blocking write(2) syscall을 유발하는 과도한 Error Logging을 Prometheus Metrics 및 OTEL Tracing 기반의 비동기 모니터링으로 전환
- 가용 Port 공간 확장을 위해 LocalAddr를 랜덤 IP로 할당하는 임시 DialContext 우회 전략을 통해 Death Spiral 차단
- GOGC 및 GOMEMLIMIT 설정 최적화를 통한 GC Stop-the-world 지연 및 OOM 발생 가능성 제거
실천 포인트
- 모든 RPC 핸들러에 Concurrency Limit 설정 여부 전수 조사 - 요청 당 처리 리소스(Batch Size)의 최대 상한선(Hard Limit) 정의 및 검증 - Error 발생 시 Logging 레벨 및 방식이 시스템 성능에 미치는 영향 분석 - Client별 세분화된 Metrics(per-client o11y) 구축으로 이상 트래픽 원천 파악 체계 마련