Go语言pprof备忘录

备忘录类型文章,后续的修改会更新在我的个人站点,地址: https://pengrl.com/p/570

开启web方式

1
2
3
4
5
6
7
import _ "net/http/pprof"

// 如果你的程序没有开启http服务,那么还需要添加如下代码开启http服务
import "net/http"
http.ListenAndServe("0.0.0.0:10001", nil)

// 可以参考这篇 https://pengrl.com/p/33895/ 关于 http/pprof 的源码阅读

通过http接口获取prof输出文件

1
2
3
4
5
$go tool pprof http://127.0.0.1:10001/debug/pprof/profile   # 30-second CPU profile
$go tool pprof http://127.0.0.1:10001/debug/pprof/heap
$go tool pprof http://127.0.0.1:10001/debug/pprof/block
$go tool pprof http://127.0.0.1:10001/debug/pprof/goroutine
$go tool pprof http://127.0.0.1:10001/debug/pprof/mutex

特定信息获取

1
2
3
4
5
6
(pprof) help
(pprof) top10
(pprof) pdf
(pprof) web
(pprof) web <func name>
(pprof) list <func name>

通过web页面访问prof结果

1
2
3
4
http://127.0.0.1:10001/debug/pprof/

http://127.0.0.1:10001/debug/pprof/goroutine?debug=1
http://127.0.0.1:10001/debug/pprof/goroutine?debug=2

分析trace

1
2
$wget -O trace.out http://127.0.0.1:10001/debug/pprof/trace
$go tool trace trace.out

火焰图

Go 1.10版本开始将火焰图功能从google/pprof中集成到了go tool pprof中。
所以按Go版本的不同有两种方式可供选择。

1
2
3
4
5
6
7
8
# 1. Go 1.10之后的版本
$ go tool pprof -http=:10002 http://127.0.0.1:10001/debug/pprof/profile

# 2. Go 1.10之前的版本
$go get -u github.com/google/pprof
$wget http://127.0.0.1:10001/debug/pprof/profile
$pprof -http=:10002 profile
# 用浏览器访问 http://localhost:10002/ui/flamegraph

mem相关字段说明

1
2
3
4
5
6
7
8
9
TODO 这部分内容待整理

Alloc 应用层持有的。和HeapAlloc字段相同
TotalAlloc 只会增长
HeapAlloc 应用持有的,以及GC还没有归还给OS的?
HeapIdle GC持有的空闲的
HeapReleased 归还给OS的
Mallocs
Frees

手动添加pprof开始结束代码,生成prof输出文件

1
2
3
4
5
6
7
f, err := os.Create("demo.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

f, err := os.Create("demo.mprof")
pprof.WriteHeapProfile(f)
f.Close()

加载输出的pprof文件

1
2
3
4
5
$go tool pprof demo demo.prof
$go tool pprof demo demo.mprof
$go tool pprof --alloc_space demo demo.mprof
$go tool pprof --alloc_objects demo demo.mprof
$go tool pprof --inuse_objects demo demo.mprof

参考链接

本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/570/

0%