Go语言pprof备忘录

1,625 阅读1分钟
原文链接: pengrl.com

开启web方式

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输出文件

$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

特定信息获取

(pprof) help
(pprof) top10
(pprof) pdf
(pprof) web
(pprof) web <func name>
(pprof) list <func name>

通过web页面访问prof结果

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

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

火焰图

$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相关字段说明

TODO 这部分内容待整理

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

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

f, err := os.Create("demo.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

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

加载输出的pprof文件

$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

参考链接