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