Golang的pprof是一个性能分析工具,可以用于分析程序的CPU、内存使用情况等,可以帮助我们快速定位代码中的性能瓶颈。
pprof提供了两种类型的性能分析:CPU profile和Memory 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
- 在 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/
- 访问 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/