go 언어에서 profiling 하기
By SeukWon Kang
python도 그렇지만 go언어도 기본적으로 profiler를 제공합니다만, 정작 쓰려면 약간 귀찮은 관계로 제가 만들어 두고 거의 cut/paste 해서 사용하는 방법입니다.
아래 코드는 간단한 프로그램을 짤때 복사해 쓰는 파일의 내용입니다. 뭔가 파일 하나 짜리 프로그램을 짜서 테스트 할때 사용하곤 합니다.
이 자체로도 실행가능한 형태이며 그냥 실행하면 프로파일링이 실행되진 않고 더 아래에 있는 쉘 스크립트를 사용하거나 인자로 -pfilename을 주면 됩니다.
실행이 끝나면 자동으로 프로파일러가 실행되어 command를 기다리는 형태가 됩니다.
간단하게 프로파일 결과를 보고 싶으면 top30 같은 형태로 top + 수자 ( 빈칸 없이) 를 실행하면 됩니다.
//start
package main
import (
"flag"
"fmt"
"log"
"math/rand"
"os"
"runtime"
"runtime/pprof"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
runtime.GOMAXPROCS(runtime.NumCPU())
}
func main() {
var profilefilename = flag.String("pfilename", "", "profile filename")
flag.Parse()
args := flag.Args()
if *profilefilename != "" {
f, err := os.Create(*profilefilename)
if err != nil {
log.Fatalf("profile %v", err)
}
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
sttime := time.Now()
doMain(args)
fmt.Printf("%v\n", time.Now().Sub(sttime))
}
func doMain(args []string) {
fmt.Printf("%v\n", args)
}
//end
아래 스크립트는 대충 만들어 쓰는 것이라 조심해서 사용해야 합니다. 인자로 go 파일 이름을 .go 를 빼고 주어 실행 해야 합니다. 이를 까먹으면 go 파일 소스가 지워 집니다. ( 한번 날려 먹은 적이 있습니다. 곧바로 git에서 다시 꺼내 왔지만 ^^) 정 불안하면 마지막 줄을 지워 버리고 사용하시면 됩니다. ( 적어도 지워지지는 않을테니 ) 좀 시간이 나면 제대로 다시 만들어야겠다고 생각(만)하고 있습니다.
#!/usr/bin/env sh
PRGNAME="$1"
shift
go build ${PRGNAME}.go
./${PRGNAME} -pfilename ${PRGNAME}.pprof $*
go tool pprof ${PRGNAME} ${PRGNAME}.pprof
rm ${PRGNAME} ${PRGNAME}.pprof
ps) 2015-02-14 추가 github에 올려두었습니다. https://github.com/kasworld/gotemplate