go tool 使用 | 豆包MarsCode AI刷题

36 阅读2分钟

由于 Go 语言内置了对 pprof 的支持,因此无需额外安装其它依赖,只需要在程序入口处引入相关包,并且启动一个服务即可

package main

import (
    "net/http"
    _ "net/http/pprof"
    // ...
)

func main() {
    go func() {
        // pprof 服务器,将暴露在 6060 端口
        if err := http.ListenAndServe(":6060", nil); err != nil {
            panic(err)
        }
    }()

    // ...
}

在本地运行程序,打开 http://localhost:6060/debug/pprof/,将看到如下界面:

各项数据,参数如下:

  • CPU 分析(profile): 可以在 url 上用 seconds 参数指定抽样持续时间(默认 30s),获取到概览文件后可以用 go tool pprof 命令调查这个概览
  • 内存分配(allocs): 所有内存分配的抽样
  • 阻塞(block): 堆栈跟踪导致阻塞的同步原语
  • 命令行调用(cmdline): 命令行调用的程序
  • goroutine: 当前 goroutine 的堆栈信息
  • 堆(heap): 当前活动对象内存分配的抽样,完全也可以指定 gc 参数在对堆取样前执行 GC
  • 互斥锁(mutex): 堆栈跟踪竞争状态互斥锁的持有者
  • 系统线程的创建(threadcreate): 堆栈跟踪系统新线程的创建
  • trace: 追踪当前程序的执行状况. 可以用 seconds 参数指定抽样持续时间. 获取到 trace 概览后可以用 go tool pprof 命令调查这个 trace

pprof命令行工具: pprof 是 golang 官方提供的性能调优分析工具,可以对程序进行性能分析,并可视化数据,当 go 程序遇到性能瓶颈时,可以使用这个工具来进行调试并优化程序。

程序运行后,打开一个终端环境,输入 go tool pprof http://localhost:6060/debug/pprof/allocs

常见命令:

top:列出当前资源的占用情况,默认会按照资源占用率从高到低;
    其中:flat:函数内所有直接语句的时间或内存消耗;
         cum:函数内所有直接语句,以及其调用的子函数的时间或内存消耗;
         sum:没有在文档中找到对应解释,但是通过观察可以发现,它是 flat% 的累加值。

list 函数名: 通过前面top查看想看的函数,定位到具体的代码位置(正则匹配)

web: 可视化分析,需要安装 Graphviz 工具,macOS推荐源码安装
    其中有各种试图:top视图、source视图、火焰图等等

其中关于web:
可以通过 
go tool pprof -http=:8888 http://localhost:6060/debug/pprof/xxx命令
直接打开想看的东西,其中xxx为:
    1. heap:分析展示堆内存占用
    2. goroutine:展示协程创建使用情况
    3. mutex:锁使用情况
    4. block:阻塞情况