[Go] pprof: 프로파일러

Go는 언어 차원에서 자체적인 성능 프로파일링 도구를 제공한다.

조금 단점은, 무조건 서버를 띄워야만 한다는 것이다. 원래 서버 프로그램이 아니었더라도 프로파일링을 하려면 HTTP 서버를 띄워야 한다.

echo나 gin 등의 전문화된 라이브러리로 서버를 구성한 상태라면, 프로파일링용으로 포트 하나 더 따서 서버를 하나 더 열거나 전용 라이브러리를 써야 할 것이다. route가 엄격히 통제되기 때문에 pprof path가 뚫리지 않는 것 같다.

그래서 일단 서버가 이런 형태로라도 있어야 하고

package main

import (
	"fmt"
	"net/http"
)

func main() {
	// 간단한 http 서버 예제
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World!")
	})

	fmt.Println("서버 시작 중...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("서버 시작 실패: ", err)
	}
}

여기다가 pprof 모듈을 import만 해주면 자동으로 주입이 된다.

그럼 이렇게 기본으로 "/debug/pprof"라는 경로에 전용 페이지가 서빙된다.

여기서 궁금한 항목 눌러서 보면 되는데

allocs로 들어가면 말 그대로 할당에 대한 기록이 실시간으로 뜨고 (새로고침을 계속 해야 함)

이건 고루틴 프로파일

힙 프로파일이다.

만약 프로파일 데이터를 다운받아서 써야 할 일이 있다면

저 pprof를 누르면

30초 정도의 로딩과 함께 떨어진다.
30초 동안 cpu 프로파일을 돌린 다음에 그 30초어치의 프로파일링 데이터를 던져주는 것이다.

다른 부분은 상관없는데 저 다운로드가 부하가 좀 될 수 있는 부분이다.
1-5% 정도의 오버헤드는 감안해야 한다.
해당 액세스를 관리자 수준으로만 제한하면 프로덕션에는 큰 무리가 없다.


참조
https://stackoverflow.com/questions/26545159/how-big-is-pprof-import-overhead-in-go