为什么剖析器不适合我?

时间:2017-11-06 11:08:45

标签: ubuntu go windows-10 profiling windows-subsystem-for-linux

鉴于以下玩具代码,我希望能够运行

go tool pprof cpu.prof

并获取有关waster1和waster2的有用信息,但是当我在pprof中运行top时,我得到的只是:

Showing nodes accounting for 0, 0% of 0 total
      flat  flat%   sum%        cum   cum%

问题可能是我使用WSL在Windows 10上运行Ubuntu。

以下是我正在使用的代码:

package main

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

func waster2() int {
    j := 0;
    for i := 0; i < 100; i++ {
        j += waster1()
    }
    return j
}

func waster1() int {
    j := 0;
    for i := 0; i < 10000; i++ {
        j++
    }
    return j
}

func main() {
    f, err := os.Create("cpu.prof")

    if err != nil {
        log.Fatal("could not create CPU profile: ", err)
    }

    if err := pprof.StartCPUProfile(f); err != nil {
        log.Fatal("could not start CPU profile: ", err)
    }

    defer pprof.StopCPUProfile()

    j := waster2()

    fmt.Println(j)
}

2 个答案:

答案 0 :(得分:3)

问题是您正在使用WSL在Windows 10上运行Ubuntu。

答案 1 :(得分:1)

在Windows上运行也不会在探查器中生成任何样本。来自go博客的以下article声明如下:

When CPU profiling is enabled, the Go program stops about 100 times per second and 
records a sample consisting of the program counters on the currently executing 
goroutine's stack.

运行代码的时间少于2毫秒,因此不允许分析器采样。将循环次数从100增加到10000,然后您应该在输出中看到一些样本。

另请注意,请务必关闭文件f。像这样:

if err != nil {
    log.Fatal("could not create CPU profile: ", err)
}
defer f.Close()