피드로 돌아가기
Dev.toBackend
원문 읽기
에러 없는 지연 시간 증가 해결을 위한 Go concurrency 경계 설계
The Go Service That Slowed Down Without Errors
AI 요약
Context
Go의 goroutine이 제공하는 낮은 메모리 풋프린트(2KB)로 인한 무제한적 생성 경향 분석. Unbounded fan-out 상황에서 scheduler의 runqueue가 급증하며 CPU 사용량 증가 및 Latency 상승을 유발하는 구조적 한계점 식별.
Technical Solution
- GODEBUG=schedtrace=1000 설정을 통한 runqueue 추이 분석 및 Scheduler 포화 상태 진단
- Bounded Queue 기반의 Worker Pool 도입으로 처리량 제한 및 Upstream에 대한 Backpressure 전파 구조 설계
- golang.org/x/sync/semaphore를 활용한 Weighted Semaphore 구현으로 동시 실행되는 Parallelism의 상한선 설정
- Context-aware Acquire 방식을 통한 리소스 획득 대기 시간 제어 및 타임아웃 처리 로직 적용
- 모든 go func() 생성 시 채널 폐쇄 주체와 생명 주기(Life cycle)를 명시하는 설계 원칙 수립
실천 포인트
1. 모든 go func() 호출 전 '병렬성 제한 수단(Semaphore/Pool)'이 존재하는지 검토
2. '채널 폐쇄 책임자'와 '종료 조건'이 코드상에 명시되어 있는지 확인
3. 부하 테스트 시 단순 Error Rate가 아닌 GODEBUG=schedtrace를 통한 runqueue 추이 모니터링