前言
Golang的pprof性能分析工具实现了对如下数据的的收集和分析:
- Goroutine 统计分析程序运行过程中的go协程数量。
- CPU CPU占用分析
- Heap 统计内存的堆分配情况,通常用来分析内存泄漏
- Allocation 统计内存的对象分配情况,同样用于分析内存泄漏
- Thread 线程数统计
- Block 记录go协程,channel等阻塞情况
- Mutex 互斥锁分析
其中在两个包内实现了pprof工具:
net/http/pprof针对http服务的性能分析runtime/pprof针对普通程序的性能分析
另如果使用了第三方的http框架,可以使用第三方库中提供的pprof实现,例如使用了Gin,可以使用gin-contrib包下的pprof实现,使用参考第三方库中的说明。
runtime
func StartCPUProfile(w io.Writer) error
func StopCPUProfile()
func WriteHeapProfile(w io.Writer) error
- StartCPUProfile为当前运行的程序开始CPU性能分析,分析结果会写入w中。
- WriteHeapProfile为当前运行的程序开始内存分配的堆性能分析,分析结果会写入w中。
Example
func main() {
f, err := os.Create("file path to cpu porfile")
// 开启 CPU profiling
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
do something...
}
程序运行结束后,会在生成指定文件,使用分析工具可读取。
net/http
在我们的http程序中只需要导入net/http/pprof包,该包中的init函数中会自动给每个接口添加监控:
import (
"net/http"
_ "net/http/pprof"
)
然后我们在后续的分析中可以直接访问http服务的/debug/pprof路径即可实时查看web程序的性能分析。
分析
我们可以使用工具来分析生成的.prof文件,通过-http或者-web标签来指定端口,后可用浏览器访问分析结果:
go tool pprof -http=:8888 cpu.prof
如果是http的web服务,可以在对应的功能模块下载数据后用工具分析:
go tool pprof 'http://localhost:8080/debug/pprof/profile?seconds=30'