[Go] pprof: 프로파일 시각화하기
이전 포스트
https://m.blog.naver.com/sssang97/223176350882
go의 내장모듈을 이용해서 프로파일 서버를 띄운다고 하더라도, 그걸로 바로 분석을 하기에는 무리가 있다.

이런걸 보고 해석할 수가 있을 것 같은가?

다행히 google에서는 이에 대한 시각화 도구를 또 별도로 제공한다.
프로파일 데이터를 다운받으면, 그걸로 해당 프로파일 데이터에 대한 통계를 시각화해서 보여주는 식이다.
근데 도구 이름을 또 내장모듈과 같은 pprof로 지어놨다. 제정신인가?
https://github.com/google/pprof
나는 이름이 같길래 별도 레포로 먼저 관리하다가 내장모듈로 이식한건줄 알았다. 근데 보니까 아예 다른 놈이다.
Graphbiz
필수 의존성이다. 먼저 이걸 깔아줘야 한다.
아래 페이지에 가서 가이드를 따르자.
https://graphviz.org/download/
환경변수에 추가하는 것을 잊지 말자.

pprof cli 설치
아래와 같이 설치하면 된다.
go install github.com/google/pprof@latest

그래서 실행되면 설치는 된 것이다.
이제 프로파일 데이터를 마련해보자.
프로파일 데이터 마련
그냥 로컬 pprof 페이지에 들어가서 프로파일 데이터를 직접 다운받아도 되고, 당근에서 하는것처럼 프로파일 데이터 전송을 자동화할 수도 있을 것이다.
https://blog.naver.com/sssang97/223177695996
여기서는 능동적인 테스트를 위해 그냥 직접 다운받겠다.
우선 아래와 같은 형태로 서버를 구성했다.
package main
import (
"fmt"
"net/http"
"strconv"
_ "net/http/pprof"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Routes
e.GET("/", hello)
// Routes
e.GET("/heavy", heavyOperations)
e.GET("/debug/pprof", echo.WrapHandler(http.DefaultServeMux))
e.GET("/debug/pprof/*", echo.WrapHandler(http.DefaultServeMux))
// Start server
e.Logger.Fatal(e.Start(":55555"))
}
// Handler
func hello(c echo.Context) error {
name := c.Param("name")
fmt.Println(name)
text := "Hello, " + name
return c.String(http.StatusOK, text)
}
func heavyOperations(c echo.Context) error {
var i int
// Some heavy stuff here
for i = 0; i < 100000000; i++ {
_ = i * 2
}
return c.String(http.StatusOK, "Hello, : "+strconv.Itoa(i))
}
pprof를 활성화하고, API는 가벼운 것 하나, 무거운 것 하나를 구현해뒀다.
둘다 쏴보면서 얼마나 차이가 나나 모니터링을 해보겠다.
그리고 아래는 k6로 작성한 부하테스트 스크립트다.
import http from "k6/http";
import { sleep } from "k6";
export const options = {
vus: 100,
duration: "3000s",
};
export default function () {
http.get("http://localhost:55555");
http.get("http://localhost:55555/heavy");
sleep(1);
}
적당히 조지게 해놨다. 초당 100건 미만 정도로만 쏠 것이다.
사용법에 대해서는 별도 포스트를 참고한다.
https://blog.naver.com/sssang97/222941188944
적당히 조진 후에 프로파일 데이터를 다운받으면 준비는 끝이다.

pprof 시각화 콘솔 띄우기
이제 pprof-cli로 다운받은 프로파일 데이터를 던저셔 실행시키면 된다.
pprof -http :8080 ./profile

그럼 아래와 같은 형태로 좀 그럴듯한 페이지가 뜬다.

이런저런 옵션이 있는데

TOP은 정직하게 점유율순으로 오퍼레이션을 보여준다.
의도한대로 heavy 함수가 가장 높게 나왔다.
Graph 탭은 뭔가 널찍하게 펼쳐서 관계도와 점유율을 표시해준다.

flame graph나 flame graph(old)란 것도 있는데,

이건 좀 구린것같다.
이건 Peek 탭

source 탭은 소스코드까지 보여준다.
