jasper的技术小窝

关注DevOps、运维监控、Python、Golang、开源、大数据、web开发、互联网

Golang性能分析工具pprof

作者:jasper | 分类:Golang | 标签:   | 阅读 523 次 | 发布:2017-06-24 10:40 p.m.

最近遇到一个golang写web程序的一个问题,就是在运行几天后就无响应了,最终原因这篇暂且不论,下一篇再细说;当时再没有任何思路时,就想先对其做一些监控,然后就看了一下golang的相关分析工具pprof,发现超赞的,因此做个简单的总结和记录。

生成性能文件

在golang中其实都来自于包 runtime/pprof,通过这个包我们可以profile任意的程序,我们直接来看在程序中怎么使用它:

存放cpu和mem profile的文件:

var prof struct {
    cpu *os.File
    mem *os.File
}

开始profile:

func startProfile(cpuprofile, memprofile string) {
    if cpuprofile != "" {
        f, err := os.Create(cpuprofile)
        if err != nil {
            log.Fatalf("cpuprofile: %v", err)
        }
        log.Printf("writing CPU profile to: %s\n", cpuprofile)
        prof.cpu = f
        pprof.StartCPUProfile(prof.cpu)
    }

    if memprofile != "" {
        f, err := os.Create(memprofile)
        if err != nil {
            log.Fatalf("memprofile: %v", err)
        }
        log.Printf("writing mem profile to: %s\n", memprofile)
        prof.mem = f
        runtime.MemProfileRate = 4096
    }
}

结束profile:

func stopProfile() {
    if prof.cpu != nil {
        pprof.StopCPUProfile()
        prof.cpu.Close()
        log.Println("CPU profile stopped")
    }
    if prof.mem != nil {
        pprof.Lookup("heap").WriteTo(prof.mem, 0)
        prof.mem.Close()
        log.Println("mem profile stopped")
    }
}

这样调用startProfile和stopProfile之间的profile都被写到了文件里面,接下来就可以用go tool pprof来查看,这其实是一个交互的工具。运行:

go tool pprof (应用程序) (应用程序的prof文件)

可以进入交互界面:

具体每个命令什么意思都有相应的解释,我也就不多说了,特别对于一些要画图的,需要安装graphviz来支持,具体安装方式不多说;通过web可以很直观地看到下面这样:

或者是直接top命令看最高的,top -10看排名前十的,都超级方便的。

通过web实时查看

对于长期运行的应用,或者是web应用,有更加方便的工具来查看net/http/pprof; 使用方法:

import (
   "net/http"
    _ "net/http/pprof"
)

func main()  {
    go func() {
        http.ListenAndServe(":8010", nil)
    }()
    // other code
}

然后在浏览器里可以看到:

点击进去后可以看到明细;当然我们也可以通过go tool pprof来分析;例如:go tool pprof http://127.0.0.1:8010/debug/pprof/goroutine(查看goroutine)就能进入交互界面,其他的就和上面的差不多咯,不细说。

这样我们可以写个简单的scheduler来访问上图的地址解析出指标数据来达到监控的目的,虽然不太优雅,但总算可以做到了。

结论

其实对于golang程序来说,pprof基本上能满足所以得性能分析需求,上面说的只是一个大概,pprof的强大功能远不止这些。比如可以使用list指令查看函数的源码中每一行代码的开销以及使用weblist指令查看函数汇编以后每一句汇编指令的开销等等,总之,在pprof的帮助下,程序的开销信息变得非常清楚,优化也就变得很简单。


转载请注明出处:http://www.opscoder.info/golang_pprof.html

其他分类: