测试环境: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