之前线上遇到了内存泄露,就在找工具来分析,刚好还是个纯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页面的统计. 及对应的解释:
这里的信息都是实时变动的, 可以点击蓝色的链接, 能看到具体的信息, 如goroutine:
还可以把信息保存到本地进行分析;
下载方式: 直接运行
go tool pprof -seconds=30 http://localhost:6060/debug/pprof/XXX
执行该命令, 需等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
根据top中的展示, 看第一个函数占用比较多,可以用list看看具体的代码:
可以看到占比比较多的行数的具体位置. 再去做响应优化(此代码只是展示使用方式)
web就是可以可视化观看了. 不过需要先安装graphviz. web指令会生成一张svg格式的图片, 并用默认程序打开;类似下图:
线越深, 框越大, 所以占用的越多; 在菜单栏, 还可以多种方式进行切换.更加直观分析;
上述是直接在程序所在机器上执行, 如果说down下来的记录在其他机器上, 如果查看. 那么执行:
会在默认程序打开如上的web图:
那么在实际应用中, 可能需要排查cpu占用高/内存占用高/协程泄露/锁等等问题, 都可通过它进行分析. 是个好东西~