golang pprof简易玩法

golang的应用诊断可以依靠pprof工具, 这里总结一个快速上手的步骤.

step0: 假设

step1: 开启

对我们的应用开启profiling. 这个方法有很多, 可以直接参考runtime/pprofnet/http/pprof.

因为我们要调试的是caddy, 直接通过改配置文件并重新加载就可以开启了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## 正常服务
http://test.com:8888 {
    root /static
    log stdout
}

## 只允许本地去访问该服务, 安全起见
http://xx.yy:4869 {
    bind 127.0.0.1
    pprof
}

step2: 触发

在服务器上请求对应的url, 获取对应prof文件:

1
2
3
4
5
6
7
8
## 获取应用当前的内存情况
curl '127.0.0.1:4869/debug/pprof/heap' -H 'Host: xx.yy' -o mem.prof

## 采集应用60s内的cpu使用情况
curl '127.0.0.1:4869/debug/pprof/profile?seconds=60' -H 'Host: xx.yy' -o cpu.prof

## 采集应用10s内的goroutine调度与执行情况
curl '127.0.0.1:4869/debug/pprof/trace?seconds=10' -H 'Host: xx.yy' -o r.trace

因为配置文件指定了仅允许本地访问, 因此我们需要将对应的文件传到本地.

step3: 分析

这块分析可以用命令行, 当然更方便的是使用浏览器.

1
 go tool pprof -http :6666 ./mem.prof

有两点需要说一下:

针对trace内容可以使用需要使用trace工具:

1
 go tool trace -http :7777 ./r.trace

这里文件越大, 解析起来就越慢. 有关trace的分析使用可以参考这篇文章和小米翻译的一篇

最后

golang的诊断工具挺不错的, 一旦熟悉了, 可以方便定位和排查问题.