2015-01-22 1 views
0

나는 Linux에서 Go에 pprof를 사용하려고했지만 기능 정보는 얻지 못했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 다음은 빌드/실행 단계입니다.Go 프로필에서 기능 고장을 얻는 방법

$ rm -f silly 
$ go build -gcflags "-N -l" silly.go 
$ rm -f silly.prof 
$ ./silly --cpuprofile silly.prof 
fib(42)=267914296 
t=1.758997214s 
$ go tool pprof --text silly.prof 
1.75s of 1.75s total ( 100%) 
     flat flat% sum%  cum cum% 
    1.75s 100% 100%  1.75s 100% 

pprof의 출력에서 ​​더 자세한 정보가 필요합니다. "t = 1.75 ..."라인은 프로그램 실행에 1.75 초가 걸렸음을 나타내며, 이는 프로파일 러의 100 Hz 샘플링 속도로 샘플을 수집하는 데 충분한 시간을 필요로합니다. 여기

프로그램입니다 : 내가 레드햇 엔터프라이즈 리눅스 서버에있어에 내가 실행 해요

package main 

import (
    "flag" 
    "fmt" 
    "log" 
    "os" 
    "runtime/pprof" 
    "time" 
) 

func b(n int) int { 
    if n < 2 { 
     return n 
    } else { 
     return a(n-1) + b(n-2) 
    } 
} 

func a(n int) int { 
    if n < 2 { 
     return n 
    } else { 
     return a(n-1) + b(n-2) 
    } 
} 

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") 

func main() { 
    flag.Parse() 
    if *cpuprofile != "" { 
     f, err := os.Create(*cpuprofile) 
     if err != nil { 
      log.Fatal(err) 
     } 
     pprof.StartCPUProfile(f) 
     defer pprof.StopCPUProfile() 
    } 

    t0 := time.Now() 
    fmt.Printf("fib(42)=%v\n", a(42)) 
    t1 := time.Now() 
    fmt.Printf("t=%v\n", t1.Sub(t0)) 
} 

이동 버전 go1.4 리눅스/AMD64를 사용하여 7.0을 놓습니다.

답변

0

1.7 초 안에 충분한 프로파일 링 샘플을 얻지 못할 것입니다. 나는 적어도 30 대 이상 프로필을 좋아합니다.

프로필이 충분하면 대화 형으로 (--text 옵션없이) pprof를 사용해보십시오. 통계를 몇 가지 다른 방법으로 볼 수있을뿐 아니라 다양한 다른 시각화 형식을 출력 할 수 있습니다.

https://blog.golang.org/profiling-go-programs

+0

프로그램에서 42를 42로 변경 했으므로 실행하려면 31.55 초가 걸렸습니다. 프로파일에는 여전히 고장이 없습니다. 다양한 시각화 형식은 단일 노드를 보여줍니다. –

+0

나는 여러분의 코드를 그대로 사용했고 pprof는 main.a와 main.b 사이의 시간을 보여줍니다. 우연히 VM에서 이걸 실행하고 있습니까? osx에서 virtualbox 내부를 프로파일 링하는 데 문제가 발생했습니다. Linux on aws는 잘 작동하는 것 같습니다. – JimB

+0

예제가 유용하다는보고를 해주셔서 감사합니다. 그것은 코딩 오류를 배제합니다. 내 설치 또는 기계 여야합니다. 나는 가상 머신 상에 있지 않다고 생각했지만 재확인 할 것이다. –

0

그것은 pprof 도구를 호출 할 때 실수가 바이너리 명을 생략되었다 밝혀졌습니다. 올바른 호출은 다음과 같습니다 내 질문에

$ go tool pprof --text silly silly.prof 
1750ms of 1750ms total ( 100%) 
     flat flat% sum%  cum cum% 
    1060ms 60.57% 60.57%  1750ms 100% main.a 
    690ms 39.43% 100%  1750ms 100% main.b 
     0  0% 100%  1750ms 100% main.main 
     0  0% 100%  1750ms 100% runtime.goexit 
     0  0% 100%  1750ms 100% runtime.main 

라인이 silly을 생략, 즉 바이너리 파일을 프로파일 링 할 수 있습니다.

관련 문제