无法使用Go Profile配置代码

时间:2013-12-08 01:17:58

标签: go profiling

我想通过go blog中的示例来了解Go Pro文件管理器。我不确定我做错了什么。但我的profiled生成的输出显示0个样本。这很奇怪。

rahul@g3ck0:~/programs/go$ go tool pprof parallel cpuprofile 
Welcome to pprof!  For help, type 'help'.
(pprof) top5  
Total: 0 samples

以下是我的代码:

package main

import (
    "fmt"
    "os/exec"
    "sync"
    "strings"
    "runtime/pprof"
    "os"
)

func exe_cmd(cmd string, wg *sync.WaitGroup) {

    out, err := exec.Command(cmd).Output()
    if err != nil {
        fmt.Println("error occured")
        fmt.Printf("%s", err)
    }
    fmt.Printf("%s", out)

    wg.Done()
}

func main() {
     f, _ := os.Create("cpuprofile")
     pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    cmd := "echo newline >> blah.txt"
    parts := strings.Fields(cmd)
    head := parts[0]
    parts = parts[1:len(parts)]
    out, err := exec.Command(head,parts...).Output()
    if err != nil {
         fmt.Println("error occured")
         fmt.Printf("%s", err)
        }
        fmt.Printf("%s", out)

}

1 个答案:

答案 0 :(得分:2)

您的配置文件程序运行时间不足以让分析器获取任何分析样本。 基本上,探查器会定期查看程序的状态(执行哪些代码,该功能是什么,......)。如果程序终止的速度比查找状态的例程更快,那么就不会对状态进行采样,因此最后没有要查看的样本。

这就是你发生的事情。

一种解决方案是将探查器的sample rate设置为更高的值,反之亦然 是让你的程序实际上做一些需要更长时间的事情。例如:

 f, _ := os.Create("cpuprofile")

 pprof.StartCPUProfile(f)
 defer pprof.StopCPUProfile()

 for i := 0; i < 10; i++ {
      time.Sleep(1 * time.Second)
 }

或者,当试图弄清楚代码的孤立部分出了什么问题时, 你可以写一个benchmark并描述那个基准。