之前线上遇到了内存泄露,就在找工具来分析,刚好还是个纯go的项目, 就找到pprof. 来串一下如何使用吧;

pprof可以支持多种类型的采样分析. 可以分析cpu或者内存或者goroutine等

集成很简单, 在工程中引入如下代码:

import _ "net/http/pprof"

go func() {
  log.Println(http.ListenAndServe("localhost:6060", nil))
}()

注: runtime/pprof: 手动调用start/stop api进行采集,可定制化分析;
net/http/pprof: 采集Http Server 的运行时数据进行分析;

这时候如果访问: http://127.0.0.1:6060/debug/pprof 就可以看到web页面的统计. 及对应的解释:

go性能分析工具--pprof使用_golang


go性能分析工具--pprof使用_开发语言_02


这里的信息都是实时变动的, 可以点击蓝色的链接, 能看到具体的信息, 如goroutine:

go性能分析工具--pprof使用_golang_03


还可以把信息保存到本地进行分析;

下载方式: 直接运行

go tool pprof -seconds=30 http://localhost:6060/debug/pprof/XXX

go性能分析工具--pprof使用_golang_04


执行该命令, 需等30s(可调整seconds值),pprof 会进行 CPU Profiling.结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出.具体可执行 pprof help 查看命令说明

也可以导出为文件

curl http://localhost:6060/debug/pprof/profile?seconds=10 > cpu.out

比较常用的top list和web. top可以看到消耗前n的函数. 默认top是top10

go性能分析工具--pprof使用_Server_05


go性能分析工具--pprof使用_golang_06


根据top中的展示, 看第一个函数占用比较多,可以用list看看具体的代码:

go性能分析工具--pprof使用_开发语言_07


可以看到占比比较多的行数的具体位置. 再去做响应优化(此代码只是展示使用方式)

web就是可以可视化观看了. 不过需要先安装graphviz. web指令会生成一张svg格式的图片, 并用默认程序打开;类似下图:

go性能分析工具--pprof使用_Server_08


线越深, 框越大, 所以占用的越多; 在菜单栏, 还可以多种方式进行切换.更加直观分析;上述是直接在程序所在机器上执行, 如果说down下来的记录在其他机器上, 如果查看. 那么执行:

go性能分析工具--pprof使用_web页面_09


会在默认程序打开如上的web图:

go性能分析工具--pprof使用_Server_10


那么在实际应用中, 可能需要排查cpu占用高/内存占用高/协程泄露/锁等等问题, 都可通过它进行分析. 是个好东西~