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

step0: 假设

  • 我们现在的应用跑在远端
  • 我们本地的go为1.11版本(webui支持了火焰图)
  • 诊断的应用是caddy

step1: 开启

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

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


## 正常服务
http://test.com:8888 {
    root /static
    log stdout
}

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

step2: 触发

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


## 获取应用当前的内存情况
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: 分析

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


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

有两点需要说一下:

  • 直接在web界面选择flame graph可以观察火焰图
  • 可以使用-base x.prof来做对比, 通常是看两个时间点的内存(图中会有-符号)

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


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

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

最后

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