laeshiny
7 min readJan 1, 2018

Golang package pprof in /net/http

개요

Golang에는 pprof 라는 package가 있습니다. 이 패키지는 동작중인 프로세스의 상태 정보를 보여줍니다. 어떻게 보여주냐면 http 서버를 하나 띄워서 http request를 날리면 거기에 맞춰서 정보를 보여줍니다. 그래서 이 패키지가 net/http 밑에 있는 것 같습니다.

pprof 패캐지가 제공하는 정보

  • heap profile
  • 30-second CPU profile
  • goroutine blocking profile
  • 5-second execution trace
  • the holders of contended mutexes

pprof package 사용 방법

각 정보를 보기 위해 소스에 먼저 아래 코드를 삽입해야 합니다.

// import package
import _ "net/http/pprof"
// http로 통신하기 위한 웹서버 띄우는 부분
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()

테스트를 위해 goroutine과 channel을 임의로 생성해 보겠습니다. 실행하기 위한 전체 코드는 아래와 같습니다.

package main

import (
"log"
"math/rand"
"net/http"
_ "net/http/pprof"
"time"
)

func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()

ch := make(chan int)
go func() {
for {
ch <- rand.Intn(10)
time.Sleep(time.Second * 2)
}
}()

for {
select {
case <-ch:
time.Sleep(time.Second * 2)
}
}

}

gorilla mux 를 사용하는 경우

웹서버를 개발할 때 라우팅을 외부 패키지를 사용하는 경우가 많을 텐데요. 그 중에서 대표적인 패키지인 gorilla mux를 예를 들어 라우팅하는 예제를 보겠습니다.

package main

import (
"github.com/gorilla/mux"
"log"
"math/rand"
"net/http"
"net/http/pprof"
"time"
)

func YourHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Gorilla!\n"))
}

func main() {
ch := make(chan int)
go func() {
for {
ch <- rand.Intn(10)
time.Sleep(time.Second * 2)
}
}()

go func() {
for {
select {
case <-ch:
time.Sleep(time.Second * 2)
}
}
}()

r := mux.NewRouter()
r.HandleFunc("/", YourHandler)

r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/{category}", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)

log.Fatal(http.ListenAndServe(":6060", r))
}

제공하는 기능 보는 방법

브라우저를 이용하는 방법

브라우저에 아래와 같은 주소를 입력하면 필요한 정보를 브라우저를 통해 볼 수 있습니다.

http://localhost:6060/debug/pprof/

heap 정보를 보기위해 “heap” 링크를 클릭하면 아래 처럼 나옵니다.

다른 정보들도 이런식으로 확인할 수 있습니다.

pprof 툴을 이용하는 방법

예제로 heap 관련 정보를 보기 위해 아래 아래와 같은 명령어를 수행합니다.

go tool pprof http://localhost:6060/debug/pprof/heap

위 명령어를 실행하면 아래와 같은 화면이 나옵니다.
“(pprof)” 프롬프트가 뜨고 분석하고 싶은 정보를 얻기 위한 명령어를 입력합니다. 아래는 top을 입력한 화면입니다.

다른 정보들도 이런식으로 분석하면 됩니다.

// heap profile
go tool pprof http://localhost:6060/debug/pprof/heap
// 30-second CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile
// goroutine blocking profile
go tool pprof http://localhost:6060/debug/pprof/block
// 5-second execution trace
wget http://localhost:6060/debug/pprof/trace?seconds=5
// holders of contended mutexes
go tool pprof http://localhost:6060/debug/pprof/mutex

profiling과 pprof 툴 관련 내용은 아래 링크를 보시면 좋습니다.

https://blog.golang.org/2011/06/profiling-go-programs.html

Reference