使用 go tool pprof 跟踪优化 cpu 和 内存

发布时间 2023-03-22 21:16:51作者: piperck

搜了一些文章来看 实在是没有重点,自己归纳一下。

其实直接看文档已经比较清楚但是文档部分似乎没有一些介绍如何看火焰图之类的细节,这里一并归纳总结一下。

 

收集性能数据

在看数据之前首先要收集数据,我们需要在需要测试性能的代码中插入 pprof 库和启动一个 http server。 这个 server 会让我们可以访问获取运行期间性能数据。

在代码中 import 

import _ "net/http/pprof"

然后在主函数中启动一个 go routinue 保持 server 运行

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

 

查看性能数据

交互式查看 heap 直接通过

go tool pprof http://localhost:6060/debug/pprof/heap

这里会有一个问题,直接使用这个命令就会进入交互式的界面,并且会得到一个压缩文件

/Users/zzou/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz

输入 top 可以看到排序过的当前 top 消耗的函数

go tool pprof 输出的分析结果中,各列的含义如下:

flat: 此函数自身所消耗的资源量(例如 CPU 时间、内存分配等)。
flat%: 此函数自身所消耗的资源量占整个程序消耗资源的百分比。
sum%: 当前函数及之前列出的函数(按 flat% 排序)总共消耗的资源百分比。
cum: 此函数及其所有调用者(包括递归调用)消耗的资源量。
cum%: 此函数及其所有调用者消耗的资源量占整个程序消耗资源的百分比。
calls: 此函数被调用的次数(仅适用于 CPU 分析)。
calls%: 此函数被调用次数占所有函数调用次数的百分比(仅适用于 CPU 分析)。
      flat  flat%   sum%        cum   cum%
  210.56MB 55.77% 55.77%   233.56MB 61.86%  encoding/json.(*decodeState).objectInterface
   52.01MB 13.78% 69.55%    52.01MB 13.78%  reflect.mapassign_faststr
   15.24MB  4.04% 73.58%    15.24MB  4.04%  bufio.NewReaderSize
   14.54MB  3.85% 77.43%    14.54MB  3.85%  AppInsightsCollector/src/toolkits.TabSeparatedEnrichedEvent
   12.50MB  3.31% 80.74%    12.50MB  3.31%  encoding/json.(*decodeState).convertNumber
   10.91MB  2.89% 83.63%    10.91MB  2.89%  AppInsightsCollector/src/libs/deviceatlas/device.processTree
   10.66MB  2.82% 86.46%    10.66MB  2.82%  bufio.NewWriterSize
      10MB  2.65% 89.11%    10.50MB  2.78%  encoding/json.unquote (inline)
       8MB  2.12% 91.23%        8MB  2.12%  reflect.makemap
    5.02MB  1.33% 92.55%     5.02MB  1.33%  github.com/valyala/fasthttp.appendBodyFixedSize

当然我们想要看图,可视化的东西可以让我们更清晰的了解性能问题到底在哪儿

 

我们可以使用工具读取刚才获得的 gz 文件

go tool pprof -http=:8081 /Users/zzou/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz

执行上面命令会自动弹出性能页面

该图已经比较清晰的搞明白到底在哪里花费了比较多的内存了。

 

 

如果需要当然我们还可以选择查看火焰图

 

 

其实 cpu 的性能观测也跟上面一致

go tool pprof http://localhost:6060/debug/pprof/profile

下面将不再赘述了。

剩下可以可以使用的命令包含

go tool pprof http://localhost:6060/debug/pprof/heap
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
go tool pprof http://localhost:6060/debug/pprof/block
go tool pprof http://localhost:6060/debug/pprof/mutex
curl -o trace.out http://localhost:6060/debug/pprof/trace?seconds=5
go tool trace trace.out

 

 

 

Reference:

https://pkg.go.dev/net/http/pprof