golang之pprof

测试环境: go version go1.11.2 windows/amd64

go语言中自带pprof包来做代码性能的监控, 不过本篇说的不是自带的pprof怎么用, 而是一个第三方的包: github.com/pkg/profile.

话不多说, 实际使用下看看效果.
假如写了一个main.go, 内容如下(内容无实际意义, 仅测试用):

package main

import (
	"fmt"
	"github.com/pkg/profile"
)

func main() {
	defer profile.Start().Stop() // 语句1
	// defer profile.Start(profile.MemProfile).Stop() // 语句2
	s := make([]int, 0)
	slowJob(&s)
	fmt.Println(s)
}

func slowJob(slice *[]int) {
	for i := 0; i < 1<<20; i++ {
		*slice = append(*slice, i)
	}
}

这个pprof包默认统计的是CPU使用情况, 如上述语句1对应的代码所示,
编译, 运行, 生成文本显示的统计信息:

go build main.go

# windows下默认生成的是.exe文件
# 执行main.exe会得到生成的.pprof文件的路径, 这是个二进制文件
# 输出类似:
# profile: cpu profiling disabled, C:\Users\gerrylon\AppData\Local\Temp\profile667524035\cpu.pprof
main.exe 

# 注意.pprof文件路径与上一步输出的保持一致
go tool pprof -text main.exe C:\Users\gerrylon\AppData\Local\Temp\profile667524035\cpu.pprof

执行上述命令, 会得到类似如下输出:

File: main.exe
Type: cpu
Time: Feb 27, 2019 at 8:54am (CST)
Duration: 804.39ms, Total samples = 640ms (79.56%)
Showing nodes accounting for 640ms, 100% of 640ms total
      flat  flat%   sum%        cum   cum%
     330ms 51.56% 51.56%      330ms 51.56%  runtime.cgocall
      50ms  7.81% 59.38%       50ms  7.81%  runtime.memmove
省略部分内容...
      0     0%   100%      330ms 51.56%  syscall.WriteConsole

上面的结果是文本形式的, 看起来不太直观, 我们可以借助Graphviz来生成其他格式的, 如pdf格式的.

安装Graphviz很简单, 对于我的windows 64位系统, 下载zip包(下载地址: https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.zip), 下载后解压, 配置其中的bin目录到PATH环境变量中, 其中go直接调用的是其中的dot.exe.
所以, 如果你发现在提示dot…未找到时, 应该就是配置没生效(可能需要重启Console).
dot.exe
在正确配置好Graphviz后, 用
go tool pprof -pdf main.exe C:\Users\gerrylon\AppData\Local\Temp\profile667524035\c pu.pprof > D:\cpu.pdf来生成pdf文件, 效果如下(只截取了部分):
cpu.pdf
至此, 我们已经会生成关于CPU的文本和图示监控效果了, 那么内存呢?
只需要将main.go中的语句1换成语句2(看上面的代码), 生成监控结果的命令不变,
比如生成pdf的(只截取了部分):
在这里插入图片描述
这种图, 可以比较直观的看到各种调用占比.

参考:
http://lessisbetter.site/2018/11/07/Golang-pprof-step-by-step/

欢迎补充指正!

发布了231 篇原创文章 · 获赞 77 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/butterfly5211314/article/details/87966093