This博客文章提供了有关如何使用runtime/pprof
软件包分析golang程序的说明。
除了上面提到的包导入之外,还说(步骤1)将此代码添加到主函数
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()
}
然后(STEP2)运行二进制文件(在本例中名为./havlak1),将文件名(扩展名为.prof)传递给cpuprofile标志
./havlak1 -cpuprofile=havlak1.prof
然后,程序停止后,(步骤3)将二进制文件和.prof
文件传递给go tool pprof
程序
$ go tool pprof havlak1 havlak1.prof
Welcome to pprof! For help, type 'help'.
(pprof)
此时,博客作者运行了
top10
命令获取一些输出。
我已经使用我的程序完成了每个步骤(但使用了不同的二进制文件和.prof文件名)。但是,当我运行top10
命令时,我的程序会因索引超出范围而发生混乱。如果我做
cat myfile.prof
检查.prof
文件的内容,没有输出。
问题:博客帖子中是否缺少一个步骤,或者我可能做错了什么或不做.prof
文件为空?
更新
只是为了澄清,在用这个
之类的cpu标志启动二进制文件之后./ havlak1 -cpuprofile = havlak1.prof
我多次访问我的应用程序的路径,以便有机会收集数据。我停止程序后,我cat filename.prof
并且它是空的
运行此命令后
go tool pprof havlak1 havlak1.prof
我显然不能再点击我的应用程序,因为二进制文件没有运行。 (我假设二进制文件传递给go tool pprof havlak1
的原因是除了再次运行程序/保持运行之外的其他原因)
更新
我是否必须包含代码才能手动关闭它写入的文件?我可以使用包装器程序github.com/davecheney/profile
来分析我的应用程序,该程序包含一个关闭已打开文件的行。
答案 0 :(得分:1)
听起来好像文件没有被写入,看起来你正在使用延迟来暂停配置文件。如果应用程序在延迟之前退出,则无法写入配置文件。
您可以尝试在不使用延迟语句的情况下在结尾处停止分析。
您可以通过编写一个简单的测试并运行go test --cpuprofile=cpu.prof
来确保问题是您的代码而不是您的机器(所有go测试都可以使用该标志自动进行分析),然后通过{{1}查看结果}