性能调优实战-pprof | 豆包MarsCode AI

155 阅读2分钟

定位最大瓶颈而不是细枝末节,不要过早过度优化

实战项目:github.com/wolfogre/go…

引用工具

_ "net/http/pprof"

//在代码中,需要调用一个协程取监听6060端口, 上面引入包时会自动注册pprof的handler到http server
    go func() {
        if err := http.ListenAndServe(":6060", nil); err != nil {
            log.Fatal(err)
        }
        os.Exit(0)
    }() 

保持程序运行并打开这个网址,可以大致查看指标http://localhost:6060/debug/pprof/

其中:

  • allocs:查看过去所有内存分配的样本(历史累计)。
  • block:查看导致阻塞同步的堆栈跟踪(历史累计)。
  • cmdline: 当前程序的命令行的完整调用路径(从程序一开始运行时决定)。
  • goroutine:查看当前所有运行的 goroutines 堆栈跟踪(实时变化)。
  • heap:查看活动对象的内存分配情况(实时变化)。
  • mutex:查看导致互斥锁的竞争持有者的堆栈跟踪(历史累计)。
  • profile: 默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件(从开始分析,到分析结束)。
  • threadcreate:查看创建新 OS 线程的堆栈跟踪(一般没啥用)。
  • trace:mp.weixin.qq.com/s/I9xSMxy32…

注意,默认情况下是不追踪block和mutex的信息的 上文的所有信息都是实时的,如果你刷新一下,是可以看到数字在变化的。此时如果点击蓝色的连接,可以看到一些协程的栈信息,这些信息并不容易阅读。如果想要更加清晰的数据,需要将信息保存下来,在本地进行分析。

这里有一个小点要注意,在这个页面下,点击profiletrace总是会下载文件。而点击其他链接会跳转到另一个页面,来展示一些数据,但是可读性也比较差。

如果点击profile,程序会开始进行半分钟(默认值)的CPU采样,然后才会下载文件。

输入go tool pprof http://localhost:6060/debug/pprof/profile命令,可以查看CPU占用数据

输入top命令,查看 CPU 占用较高的调用,

调用最高是Eat,注意, runtime.***和main.***属于由调用的Eat引起的,不是造成CPU占用的原因, 输入

list Eat

可以查看详细情况

排查内存占用过高

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

排查频繁内存回收

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

排查协程泄露

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

排查锁的争用

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

排查阻塞操作

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

也可以通过这条命令,输入网址localhost:8080可视化查看

 go tool pprof -http=:8000 http://127.0.0.1:6060/debug/pprof/profile
 go tool pprof -http=:8000 cpu.out
 go tool pprof -http=:8000 pprof.XXX.samples.cpu.001.pb.gz

这将会启动一个web服务器,并自动打开一个网页。这个网页最上方有一个header,我们可以切换到火焰图、top、连线图。