Go
이동 도구 pprof를 사용하여 프로파일 링
수색…
비고
더 많은 프로파일 링 프로그램에 대해서는 go 블로그를 방문하십시오.
기본 CPU 및 메모리 프로파일 링
다음 코드를 주 프로그램에 추가하십시오.
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()
}
...
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
메인 go build main.go
에 main 프로그램을 추가하면 go 프로그램을 빌드 합니다. 코드 main.exe -cpuprofile cpu.prof -memprof mem.prof
정의 된 플래그로 주 프로그램을 실행하십시오. 프로파일 링이 테스트 케이스에 대해 수행되면 같은 플래그를 사용하여 테스트를 실행하십시오. go test -cpuprofile cpu.prof -memprofile mem.prof
기본 메모리 프로파일 링
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
func main() {
flag.Parse()
if *memprofile != "" {
f, err := os.Create(*memprofile)
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
runtime.GC() // get up-to-date statistics
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
f.Close()
}
}
go build main.go
main.exe -memprofile mem.prof
go tool pprof main.exe mem.prof
CPU / 블록 프로필 속도 설정
// Sets the CPU profiling rate to hz samples per second
// If hz <= 0, SetCPUProfileRate turns off profiling
runtime.SetCPUProfileRate(hz)
// Controls the fraction of goroutine blocking events that are reported in the blocking profile
// Rate = 1 includes every blocking event in the profile
// Rate <= 0 turns off profiling
runtime.SetBlockProfileRate(rate)
벤치 마크를 사용하여 프로필 만들기
주 패키지가 아닌 주 패키지의 경우 코드 내에 플래그를 추가하는 대신 테스트 패키지에 벤치 마크 를 작성하십시오. 예를 들면 다음과 같습니다.
func BenchmarkHello(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("hello")
}
}
그런 다음 프로필 플래그를 사용하여 테스트를 실행하십시오.
test -cpuprofile cpu.prof -bench = 테스트로 이동하십시오.
벤치 마크가 실행되고 파일 이름이 cpu.prof 인 prof 파일을 생성합니다 (위 예제에서).
프로파일 파일 액세스
일단 prof 파일이 생성되면 go 도구를 사용하여 prof 파일에 액세스 할 수 있습니다.
도구 pprof cpu.prof로 이동하십시오.
이것은 profile
탐색을위한 명령 행 인터페이스로 들어갑니다.
일반적인 명령은 다음과 같습니다.
(pprof) top
메모리의 상위 프로세스 나열
(pprof) peek
모든 프로세스를 나열하고 regex 를 사용하여 검색 범위를 좁 힙니다.
(pprof) web
프로세스의 그래프 (svg 형식)를 엽니 다.
top
명령의 예 :
69.29s of 100.84s total (68.71%)
Dropped 176 nodes (cum <= 0.50s)
Showing top 10 nodes out of 73 (cum >= 12.03s)
flat flat% sum% cum cum%
12.44s 12.34% 12.34% 27.87s 27.64% runtime.mapaccess1
10.94s 10.85% 23.19% 10.94s 10.85% runtime.duffcopy
9.45s 9.37% 32.56% 54.61s 54.16% github.com/tester/test.(*Circle).Draw
8.88s 8.81% 41.36% 8.88s 8.81% runtime.aeshashbody
7.90s 7.83% 49.20% 11.04s 10.95% runtime.mapaccess1_fast64
5.86s 5.81% 55.01% 9.59s 9.51% github.com/tester/test.(*Circle).isCircle
5.03s 4.99% 60.00% 8.89s 8.82% github.com/tester/test.(*Circle).openCircle
3.14s 3.11% 63.11% 3.14s 3.11% runtime.aeshash64
3.08s 3.05% 66.16% 7.85s 7.78% runtime.mallocgc
2.57s 2.55% 68.71% 12.03s 11.93% runtime.memhash