sayu.day
Backend

Go pprof를 활용한 성능 프로파일링 가이드

Go 서비스에서 pprof로 CPU/메모리/락 병목을 찾는 실전 절차를 정리합니다.

발행 2025년 12월 30일2209

같은 주제에서 이어 읽기

Enterprise Go 시리즈 #8: Observability와 Debugging

Backend 안에서 이어지는 글

원칙

추측으로 최적화하지 말고 먼저 측정합니다. 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) 실무 워크플로우

  1. 재현 가능한 부하 시나리오 준비
  2. Before profile 수집
  3. 가설 1개만 반영
  4. After profile 수집
  5. 개선 수치 확인 후 다음 가설 진행

이 순서를 지키면 "최적화했는데 느려짐" 회귀를 줄일 수 있습니다.

흔한 실수

  • 프로파일 1회 결과로 결론 내기
  • 핫패스 검증 없이 sync.Pool 남발
  • pprof를 외부에 공개

요약

pprof는 성능 도구라기보다 의사결정 도구입니다. "측정 -> 변경 -> 재측정" 루틴을 팀 표준으로 만들면 성능 이슈 대응 속도가 눈에 띄게 빨라집니다.

다음 읽기

이 생각이 이어지는 방향

Backend 더 보기
공유

읽은 뒤의 대화

읽은 뒤의 생각을 이어갑니다

질문, 반론, 조용한 후속 메모를 이 글 아래에 남길 수 있습니다.

sayu.day는 생각과 작업의 흔적을 천천히 정리하는 개인 출판물입니다.
직접 겪고 검토한 내용, 다시 읽을 만한 아이디어, 작업하며 남긴 메모를 모읍니다.
시간이 지난 글은 현재의 판단과 다를 수 있어 업데이트 맥락을 함께 남깁니다.

© 2026 sayu.day