我一直在尝试在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版上运行。
答案 0 :(得分:0)
你不会在1.7s内获得足够的分析样本。我喜欢描述至少30秒或更长时间。
如果您的个人资料足够大,请尝试以交互方式使用pprof(不使用--text
选项)。您将能够以几种不同的方式查看统计数据,并输出各种其他可视化格式。
答案 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
,即要分析的二进制文件。