Golang的pprof是一个性能分析工具,可以用于分析程序的CPU、内存使用情况等,可以帮助我们快速定位代码中的性能瓶颈。

pprof提供了两种类型的性能分析:CPU profileMemory profile

CPU profile

go tool pprof

生成CPU profile的步骤如下:

import (
    "log"
    "os"
    "runtime/pprof"
)

func main() {
    f, err := os.Create("cpuprofile")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    if err := pprof.StartCPUProfile(f); err != nil {
        log.Fatal(err)
    }
    defer pprof.StopCPUProfile()

    // 程序代码

}

在程序运行过程中,pprof会将CPU的使用情况记录到cpuprofile文件中。当我们需要分析程序性能时,可以使用以下命令:

$ go tool pprof -http=:8080 cpuprofile
http://localhost:8080

Memory profile

生成Memory profile的步骤如下:

import (
    "log"
    "os"
    "runtime/pprof"
)

func main() {
    f, err := os.Create("memprofile")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    if err := pprof.WriteHeapProfile(f); err != nil {
        log.Fatal(err)
    }

    // 程序代码
}

在程序运行过程中,pprof会将内存的分配情况记录到memprofile文件中。当我们需要分析程序内存使用时,可以使用以下命令:

$ go tool pprof -http=:8080 memprofile
http://localhost:8080
runtime/pprofprofilehttp/pprof

runtime/pprof部分功能介绍

pprof是Golang标准库中的一个性能分析工具,提供了很多API供程序使用,方便对程序的性能进行分析和优化。

func StartCPUProfile(w io.Writer) errorStartCPUProfileio.Writerfunc StopCPUProfile()StopCPUProfilefunc Lookup(symbol string) *Profilefunc WriteHeapProfile(w io.Writer) errorWriteHeapProfilefunc WriteProfile(p *Profile, name string) errorWriteProfile

这些API可以方便地对程序进行性能分析,可以通过手动触发分析数据的收集,并将分析数据写入文件中,然后通过pprof工具进行分析。此外,pprof还提供了一些其他的API,如通过HTTP接口获取性能分析数据等,方便程序进行集成。

通过HTTP接口获取数据

runtime/pprofpprof
  1. 在 HTTP 服务中注册 pprof 的 HTTP 处理函数,这个函数会将 pprof 数据暴露给外部请求:
import (
    "net/http"
    _ "net/http/pprof" // 导入 pprof 包,执行包初始化函数,注册 pprof 处理函数
)

func main() {
    // 注册 HTTP 路由处理函数
    http.HandleFunc("/", myHandler)

    // 注册 pprof 处理函数
    http.HandleFunc("/debug/pprof/", pprof.Index)

    // 启动 HTTP 服务
    http.ListenAndServe(":8080", nil)
}
_ "net/http/pprof"net/http/pprofpprof.Index/debug/pprof/
  1. 访问 pprof 数据
http://localhost:8080/debug/pprof/heapgoroutinethreadcreateblockmutex

如果需要在程序代码中访问 pprof

http/pprofruntime/pprofhttp/pprof
/debug/pprof//debug/pprof/cmdline/debug/pprof/profile/debug/pprof/heap/debug/pprof/block/debug/pprof/mutex
/debug/pprof/profile
http/pprofhttp/pprofhttp.HandleFunc/debug/pprof/
package main

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

func main() {
	// 启动 http 服务,注册 pprof 相关路由
	go func() {
		err := http.ListenAndServe(":8080", nil)
		if err != nil {
			panic(err)
		}
	}()

	// TODO: 启动你的应用服务
	// ...
}
_ "net/http/pprof"http/pprofhttp.ListenAndServehttp.DefaultServeMuxhttp/pprof
http://localhost:8080/debug/pprof/