阅读 240

Go性能分析-pprof的使用 | Go主题月

前言

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
复制代码
  1. StartCPUProfile为当前运行的程序开始CPU性能分析,分析结果会写入w中。
  2. 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'
复制代码
文章分类
后端
文章标签