pprof
pprof是Go语言自带的性能调优工具之一,它可以帮助开发者分析和优化Go程序的性能问题。pprof提供了多种分析视图和功能,包括CPU分析、内存分析、阻塞分析等。
pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取各个函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。
注意,我们只应该在性能测试的时候才在代码中引入pprof。
工具型应用
如果你的应用程序是运行一段时间就结束退出类型。那么最好的办法是在应用退出的时候把 profiling 的报告保存到文件中,进行分析。对于这种情况,可以使用runtime/pprof库。 首先在代码中导入runtime/pprof工具:
import "runtime/pprof"
开启CPU性能分析:
pprof.StartCPUProfile(w io.Writer)
停止CPU性能分析:
pprof.StopCPUProfile()
应用执行结束后,就会生成一个文件,保存了我们的 CPU profiling 数据。得到采样数据之后,使用go tool pprof工具进行CPU性能分析。
服务型应用
如果你的应用程序是一直运行的,比如 web 应用,那么可以使用net/http/pprof库,它能够在提供 HTTP 服务进行分析。
import _ "net/http/pprof"
你的 HTTP 服务会多出/debug/pprof endpoint,访问它会得到类似下面的内容:
这个路径下还有几个子页面:
- /debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载
- /debug/pprof/heap: Memory Profiling 的路径,访问这个链接会得到一个内存 Profiling 结果的文件
- /debug/pprof/block:block Profiling 的路径
- /debug/pprof/goroutines:运行的 goroutines 列表,以及调用关系
功能
以下是pprof提供的一些常用分析视图和功能:
goroutine:显示当前所有goroutine的堆栈跟踪信息,用于分析goroutine泄漏或死锁等问题。heap:显示当前程序的堆内存分配情况,包括对象的数量、大小和分配时间等信息,用于分析内存泄漏或过度分配等问题。allocs:显示程序的内存分配情况,包括每个函数的分配次数和分配的字节数,用于分析内存分配的热点和优化内存分配。block:显示当前程序的阻塞事件情况,包括每个goroutine的阻塞时间和阻塞的原因,用于分析并发程序中的阻塞问题。mutex:显示当前程序的互斥锁竞争情况,包括每个互斥锁的竞争次数和竞争的goroutine信息,用于分析并发程序中的锁竞争问题。profile:生成CPU分析报告,包括每个函数的CPU占用时间和调用次数等信息,用于分析CPU瓶颈和优化函数性能。
通过访问相应的URL,可以获取到对应的分析视图。例如,访问http://localhost:8080/debug/pprof/goroutine可以获取goroutine的堆栈跟踪信息。