Cloud Run, CPU 스로틀링 설정 하나로 성능 문제 해결!
Oblique는 Cloud Run 기반 백엔드에서 데이터베이스 쿼리 성능 저하(Database Query Performance) 문제를 겪음
오픈텔레메트리(OpenTelemetry)를 활용한 추적 시스템 구축, 데이터베이스 쿼리 분석 등 2개월간의 디버깅 끝에 해결책을 찾음
문제의 원인은 Cloud Run의 CPU 스로틀링(CPU Throttling) 설정이었으며, 한 줄의 YAML 설정을 통해 해결
CPU 스로틀링 설정은 HTTP 요청이 없는 경우 CPU를 제한하여 백그라운드 작업의 성능을 저하시킴
Cloud Run CPU 스로틀링(CPU Throttling)의 함정
Oblique는 Cloud Run 환경에서 백그라운드 작업의 성능 저하 문제를 겪었으며, 그 원인이 CPU 스로틀링(CPU Throttling) 설정에 있음을 발견했다. 특히, HTTP 요청이 없는 경우 Cloud Run이 CPU를 제한하여 백그라운드 작업의 성능을 저하시킨다는 점을 간과했다. 이 문제는 인스턴스 기반 과금(Instance-based Billing) 설정을 통해 해결되었으며, 항상 전체 CPU를 사용할 수 있도록 함으로써 백그라운드 작업의 성능을 향상시켰다.
오픈텔레메트리(OpenTelemetry)를 활용한 디버깅 과정
Oblique는 성능 저하 문제 해결을 위해 오픈텔레메트리(OpenTelemetry)를 활용하여 추적 시스템을 구축했다. 이를 통해 스팬(Span) 메타데이터(Metadata)를 풍부하게 하고, 로컬에서 추적 데이터를 수집하여 분석했다. 특히, pgx 드라이버의 pool.Acquire 호출 시간을 추적하여 병목 지점을 파악하고, 개별 쿼리의 실행 시간을 측정하여 문제의 원인을 분석했다. 이러한 과정을 통해 데이터베이스 쿼리 자체의 문제가 아닌, Cloud Run 환경의 CPU 스로틀링이 문제의 원인임을 밝혀냈다.
성능 문제 해결을 위한 다양한 시도와 교훈
Oblique는 성능 문제 해결을 위해 다양한 시도를 했다. SQL 쿼리 배치(Batching), 데이터베이스 락(Lock) 경합 분석, 커넥션 풀(Connection Pool) 포화 분석, 네트워크 지연(Network Latency) 문제 검토 등 다각적인 접근을 시도했다. 이러한 과정에서 얻은 교훈은, 관측 가능성(Observability)이 중요하지만, 플랫폼에 대한 가정(Assumption)을 지속적으로 검증해야 한다는 것이다. 또한, Go 언어의 런타임(Runtime)이 낮은 리소스 환경에서도 안정적으로 작동하는 점을 높이 평가했다.
Cloud Run 환경에서의 성능 최적화 팁
이 사례는 Cloud Run 환경에서 백그라운드 작업을 수행하는 경우, run.googleapis.com/cpu-throttling: "false" 설정을 통해 CPU 스로틀링을 비활성화하는 것이 중요함을 강조한다. 또한, 오픈텔레메트리(OpenTelemetry)와 같은 관측 도구를 활용하여 시스템의 동작을 면밀히 모니터링하고, 성능 저하의 원인을 정확하게 파악하는 것이 필요하다. 마지막으로, Cloud Run의 과금 방식(Billing Mode)에 대한 이해를 바탕으로, 비용 효율적인 설정을 구성해야 한다.