golang性能分析工具pprof的使用 | 豆包MarsCode AI刷题

63 阅读4分钟

Golang的pprof是一个强大的性能分析工具,它可以帮助开发者分析程序在运行时的资源消耗情况。pprof可以分析多种资源使用。 pprof可以进行以下分析:

  1. CPU分析:通过分析CPU的使用情况,可以了解程序中哪些函数占用CPU时间最多。这有助于发现程序的性能瓶颈。
  2. 内存分析:内存分析可以帮助开发者了解程序的内存分配情况,识别内存泄漏或者过度分配的问题。
  3. 协程分析:协程分析可以显示程序中所有协程的状态,帮助开发者理解协程的行为,以及它们如何影响程序的性能。
  4. 阻塞分析:阻塞分析可以帮助开发者识别程序中的同步原语(如互斥锁、信号量等)阻塞的位置,这对于理解并发性能问题至关重要。
  5. 线程创建分析:线程创建分析可以显示程序中线程创建和销毁的情况,帮助开发者优化线程使用策略,提高程序效率。

使用pprof

首先运行样例程序于6060端口,然后在命令行输入如下命令运行pprof工具,捕捉10秒内的数据。

 go tool pprof "http://localhost:6060/debug/pprof/profile?second=10"

排查cpu占用

结果如下,使用top命令查看具体性能消耗

```shell
Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile?second=10
Saved profile in /home/tcl/pprof/pprof.___go_build_github_com_wolfogre_go_pprof_practice.samples.cpu.001.pb.gz
File: ___go_build_github_com_wolfogre_go_pprof_practice
Type: cpu
Time: Nov 23, 2024 at 9:22pm (CST)
Duration: 30.06s, Total samples = 9.24s (30.74%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 9.19s, 99.46% of 9.24s total
Dropped 16 nodes (cum <= 0.05s)
      flat  flat%   sum%        cum   cum%
     9.19s 99.46% 99.46%      9.19s 99.46%  github.com/wolfogre/go-pprof-practice/animal/felidae/tiger.(*Tiger).Eat
         0     0% 99.46%      9.19s 99.46%  github.com/wolfogre/go-pprof-practice/animal/felidae/tiger.(*Tiger).Live
         0     0% 99.46%      9.20s 99.57%  main.main
         0     0% 99.46%      9.20s 99.57%  runtime.main
```

flat为函数本身CPU消耗,sum为前x行合计占用百分比;cum为函数本身和其调用的函数的总消耗。flat == 0时,只有调用其他函数的消耗。

从统计结果可以看出,github.com/wolfogre/go-pprof-practice/animal/felidae/tiger.(*Tiger).Eat 函数占用了99.46%的CPU时间,成为程序的主要性能瓶颈。Eat函数:直接消耗了9.19秒,占总CPU样本的99.46%。Live函数虽然自身不直接消耗CPU,但其调用链中包含了Eat函数,累计消耗同样为99.46%。main.mainruntime.main函数主要负责程序的启动和运行管理,消耗时间接近于Eat函数,因为主要的CPU消耗来源于Eat

使用list+函数名命令查找具体代码行。

可视化:web命令

排查内存占用

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap

即可弹出可视化网页

alloc_mem排查分配内存。

排查协程

go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

block-阻塞

/block

总结pprof的使用方法及其意义和作用如下:

使用方法总结:

  1. 使用top命令查看CPU性能消耗,可以快速定位到消耗CPU最多的函数。
  2. 使用list命令加上函数名可以查看该函数的具体代码行,帮助进一步分析性能瓶颈。
  3. 使用web命令可以生成函数调用的图形化界面,帮助更直观地理解函数调用关系和性能分布。
  4. 对于内存占用的分析,可以通过访问http://localhost:6060/debug/pprof/heap获取内存占用的profile,并使用go tool pprof -http=:8080命令查看可视化的内存分配情况。
  5. 对于协程的分析,可以通过访问http://localhost:6060/debug/pprof/goroutine获取协程的profile,并使用相同的方法查看可视化信息。
  6. 对于阻塞分析,可以通过相似的方式获取和分析阻塞的profile。

pprof是一个强大的性能分析工具,它可以定位性能瓶颈,通过分析CPU和内存等资源的使用情况,快速找到影响应用性能的关键因素;可以优化代码,通过具体的函数调用和资源占用情况,指导开发者进行代码优化,提高应用的运行效率;可以理解程序行为,通过可视化的方式展示程序的运行情况,帮助开发者更好地理解程序的内部行为和线程间的交互;可以预防性能问题,定期的性能分析可以预防未来可能出现的性能问题,确保应用的稳定运行。