피드로 돌아가기
Finding Hidden Bottlenecks in Go Apps: A Lazy, Hacky, and Bruteforce Method
Dev.toDev.to
Backend

전수 추적 기반의 Brute-force 방식으로 찾은 Go 앱 병목 지점

Finding Hidden Bottlenecks in Go Apps: A Lazy, Hacky, and Bruteforce Method

alexey.zh2026년 4월 2일4intermediate

Context

PostgreSQL WAL receiver 개발 중 예측 불가능한 성능 저하 문제 발생. 단순한 오타나 비효율적인 로직으로 인한 O(n^2) 동작 등 숨겨진 병목 지점 탐색 필요. 기존 CPU/RAM 프로파일링 도구만으로는 특정 지점을 빠르게 식별하는 데 한계 존재.

Technical Solution

  • 모든 함수 실행 시간과 호출 횟수를 전수 추적하는 Brute-force 측정 전략 채택
  • CLI 명령 한 번으로 프로젝트 내 모든 함수에 타이밍 코드를 주입하는 gotrackfunc 라이브러리 활용
  • 프로그램 실행 및 부하 테스트를 통해 함수별 실행 시간을 gotrackfunc.log 파일로 수집
  • 수집된 로그를 분석하여 전체 시스템에서 가장 실행 시간이 긴 함수를 순위별로 나열하는 요약 보고서 생성
  • 식별된 최하위 성능 함수를 대상으로 정밀 프로파일링 및 리팩토링 수행
  • 코드 주입 방식의 특성을 고려하여 버전 관리 시스템을 통한 변경 사항 롤백 전략 유지

Impact

  • storecrypt.Put 함수가 전체 실행 시간 중 23.06초를 차지하는 최악의 병목 지점임을 식별
  • receivesuperv.uploadOneFile(11.61초), fsync.Fsync(8.81초) 순으로 성능 저하 요인 정량적 확인

Key Takeaway

정밀한 프로파일링 도구 이전에 모든 지점을 단순하게 측정하는 Brute-force 방식이 병목 지점을 빠르게 좁히는 효율적인 진입점이 될 수 있음.


원인 불명의 성능 저하 시, 전수 추적으로 병목 후보군을 압축한 뒤 정밀 프로파일링을 수행할 것

원문 읽기