go学习(九)——Go tool pprof之runtime/pprof 的使用

测试环境:centos7 go1.9 go1.6 gvmv1.0.22

Go 中监控代码性能的有两个包:

  • net/http/pprof
  • runtime/pprof

这两个包都是可以监控代码性能的, 只不过net/http/pprof是通过http端口方式暴露出来的,内部封装的仍然是runtime/pprof。

1.CPU Profiling

Golang 提供了 pprof 包(runtime/pprof)用于输出运行时的 profiling 数据,这些数据可以被 pprof 工具(或者 go tool pprof,其为 pprof 的变种)使用。通常我们这样来使用 pprof 包:

// 定义 flag cpuprofile
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
	flag.Parse()
	// 如果命令行设置了 cpuprofile
	if *cpuprofile != "" {
		// 根据命令行指定文件名创建 profile 文件
		f, err := os.Create(*cpuprofile)
		if err != nil {
			log.Fatal(err)
		}
		// 开启 CPU profiling
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}
	...

假定我们编写的一个程序 mytest 中加入了上述代码则可以执行并生成 profile 文件:

./mytest -cpuprofile=mytest.prof

这里,我们生成了 mytest.prof profile 文件。有了 profile 文件就可以使用 go tool pprof 程序来解析此文件:

go tool pprof mytest mytest.prof

pprof 程序中最重要的命令就是 topN,此命令用于显示 profile 文件中的最靠前的 N 个样本(samples)。

(pprof) top10
Total: 2525 samples
	298  11.8%  11.8%	 345  13.7% runtime.mapaccess1_fast64
	268  10.6%  22.4%	2124  84.1% main.FindLoops
	251   9.9%  32.4%	 451  17.9% scanblock
	178   7.0%  39.4%	 351  13.9% hash_insert
	131   5.2%  44.6%	 158   6.3% sweepspan
	119   4.7%  49.3%	 350  13.9% main.DFS
	 96   3.8%  53.1%	  98   3.9% flushptrbuf
	 95   3.8%  56.9%	  95   3.8% runtime.aeshash64
	 95   3.8%  60.6%	 101   4.0% runtime.settype_flush
	 88   3.5%  64.1%	 988  39.1% runtime.mallocgc

2.runtime/pprof 的用法示例

这里的例子我们用 递归实现的斐波纳契数列来测试性能,斐波纳契数列 的代码如下

package main


import (

    "flag"

    "fmt"

    "log"

    "os"

    "runtime/pprof"

)


var (

  //定义外部输入文件名字

  cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file.")

)


func main() {

    log.Println("begin")

    flag.Parse()


    if *cpuprofile != "" {

        f, err := os.Create(*cpuprofile)

        if err != nil {

            log.Fatal(err)

        }


        pprof.StartCPUProfile(f)

        defer pprof.StopCPUProfile()

    }


    for i := 0; i < 30; i++ {

        nums := fibonacci(i)

        fmt.Println(nums)

    }

}

//递归实现的斐波纳契数列

func fibonacci(num int) int {

    if num < 2 {

        return 1

    }

    return fibonacci(num-1) + fibonacci(num-2)

}

创建名字为testfibonacci的go文件,并写入上述代码,执行命令go build testfibonacci.go

运行程序的时候加一个--cpuprofile参数,比如./testfibonacci --cpuprofile=fibonacci.prof

这样程序运行的时候的cpu信息就会记录到XXX.prof中了。

下一步就可以使用这个prof信息做出性能分析图了(需要安装graphviz)。

查看prof文件:

使用go tool pprof (应用程序) (应用程序的prof文件),即:go tool pprof testfibonacci fibonacci.prof

进入到pprof,使用top命令可以查看样本数据,使用web命令就会生成svg文件:


参考链接:http://blog.csdn.net/zhonglinzhang/article/details/71191650

                  http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html

                  https://studygolang.com/articles/3176


你可能感兴趣的:(Go入门教程)