如何从Go配置文件中获取功能细分

时间:2015-01-22 22:58:44

标签: linux go

我一直在尝试在Linux上使用pprof for 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))
}

我正在使用Go版本go1.4 linux / amd64在Red Hat Enterprise Linux Server 7.0版上运行。

2 个答案:

答案 0 :(得分:0)

你不会在1.7s内获得足够的分析样本。我喜欢描述至少30秒或更长时间。

如果您的个人资料足够大,请尝试以交互方式使用pprof(不使用--text选项)。您将能够以几种不同的方式查看统计数据,并输出各种其他可视化格式。

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

答案 1 :(得分: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,即要分析的二进制文件。