Backend
Go pprof를 활용한 성능 프로파일링 가이드
Go 서비스에서 pprof로 CPU/메모리/락 병목을 찾는 실전 절차를 정리합니다.
Go pprof를 활용한 성능 프로파일링 가이드
원칙
추측으로 최적화하지 말고 먼저 측정합니다. pprof는 "어디서 느린지"를 함수 단위로 보여주는 근거입니다.
1) 최소 설정
import (
_ "net/http/pprof"
"net/http"
)
go func() {
_ = http.ListenAndServe("127.0.0.1:6060", nil)
}()
운영에서는 반드시 내부망 또는 인증 뒤에서만 엽니다.
2) CPU 프로파일
go tool pprof "http://127.0.0.1:6060/debug/pprof/profile?seconds=30"
기본 명령:
(pprof) top
(pprof) top -cum
(pprof) list <func>
(pprof) web
해석 포인트:
flat높음: 해당 함수 자체가 병목cum높음: 하위 호출 구조가 병목
3) 메모리 프로파일
go tool pprof http://127.0.0.1:6060/debug/pprof/heap
go tool pprof -alloc_space http://127.0.0.1:6060/debug/pprof/heap
alloc_space가 높으면 누수보다 "할당 폭탄"일 가능성이 큽니다.
4) 락/블로킹 분석
runtime.SetBlockProfileRate(1)
runtime.SetMutexProfileFraction(10)
go tool pprof http://127.0.0.1:6060/debug/pprof/block
go tool pprof http://127.0.0.1:6060/debug/pprof/mutex
5) 실무 워크플로우
- 재현 가능한 부하 시나리오 준비
- Before profile 수집
- 가설 1개만 반영
- After profile 수집
- 개선 수치 확인 후 다음 가설 진행
이 순서를 지키면 "최적화했는데 느려짐" 회귀를 줄일 수 있습니다.
흔한 실수
- 프로파일 1회 결과로 결론 내기
- 핫패스 검증 없이
sync.Pool남발 - pprof를 외부에 공개
요약
pprof는 성능 도구라기보다 의사결정 도구입니다. "측정 -> 변경 -> 재측정" 루틴을 팀 표준으로 만들면 성능 이슈 대응 속도가 눈에 띄게 빨라집니다.