测试环境: 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).
在正确配置好Graphviz后, 用
go tool pprof -pdf main.exe C:\Users\gerrylon\AppData\Local\Temp\profile667524035\c pu.pprof > D:\cpu.pdf
来生成pdf文件, 效果如下(只截取了部分):
至此, 我们已经会生成关于CPU的文本和图示监控效果了, 那么内存呢?
只需要将main.go中的语句1换成语句2(看上面的代码), 生成监控结果的命令不变,
比如生成pdf的(只截取了部分):
这种图, 可以比较直观的看到各种调用占比.
参考:
http://lessisbetter.site/2018/11/07/Golang-pprof-step-by-step/
欢迎补充指正!