我在一个小程序中有内存泄漏。为了找到泄漏,我想使用pprof
。
我这样设置:
func main() {
f, _ := os.Create("my_pprof.pprof")
pprof.StartCPUProfile(f)
go func() {
main2()
}()
time.Sleep(1*time.Minute)
pprof.StopCPUProfile()
f.Close()
panic("QUIT")
}
当我想生成图表时,我有错误:
$ go tool pprof --pdf my_prog my_pprof.pprof > callgraph.pdf
No nodes to print
为什么不能获得节点?
更新 该计划将重现该问题。
package main
import (
"fmt"
"os/exec"
"time"
"os"
"log"
"runtime/pprof"
)
func pollExec() {
ticker := time.NewTicker(5 * time.Millisecond)
quit := make(chan struct{})
for {
select {
case <-ticker.C:
const command = "cat"
const arg= "my_project/src/probe/test_pprof.go"
log.Printf("Execute command: " + command + " " + arg)
cmd := exec.Command(command, arg)
out, err := cmd.Output()
if err != nil {
panic("Can't execute command: " + command)
}
fmt.Printf("Output: %s\n", out)
case <-quit:
ticker.Stop()
return
}
}
}
func main() {
const pprofFileName = "my_project/src/probe/test.pprof"
f, err := os.Create(pprofFileName)
if err != nil {
panic("Can't open file: " + pprofFileName)
}
pprof.StartCPUProfile(f)
go func() {
pollExec()
}()
time.Sleep(1*time.Minute)
pprof.StopCPUProfile()
f.Close()
panic("QUIT")
}
我运行它:
$ uname -a
Linux ubuntu 3.13.0-34-generic #60-Ubuntu SMP Wed Aug 13 15:45:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
全局上下文是我有一个非常小的程序根据Unix命令结果推送信息。程序大小约为3MB,我只有40MB RAM可以全天候运行。当我离开示例运行时,大小正在增长和增长。我不知道泄漏在哪里,我对go
感到非常不舒服,因为这是我用这种语言编写的第一个程序。
对于本文中提供的示例,内存消耗随着时间的增加而增加:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16723 paralle+ 20 0 6408 1700 816 S 2.0 0.2 0:00.52 test_pprof
After few minutes…
16723 paralle+ 20 0 6408 1960 832 S 1.7 0.2 0:04.76 test_pprof