使用pprof分析性能

65 阅读2分钟

1 pprof

1.1 原理

1.1.1 数据采样

1.1.1.1 cpu
  • 定期采样:隔10ms sigprof中断一下,记录当前goroutine的所有函数栈信息
1.1.1.2 堆
  • 默认1000次分配做一次采样
1.1.1.3 锁
  • 默认不启用
1.1.1.4 阻塞时间
  • 如从空channel中获取数据导致阻塞

1.1.2 采集方式

1.1.2.1 性能基准测试进行数据采集
  • 在执行基准测试的同时进行性能数据采集:go test -bench -cpuporfile=cpu.profile
    • 会编译出一个和这个测试对应的可执行文件,cpu.profile存储cpu采样数据,作为数据分析的输入
1.1.2.2 独立程序的性能数据采集
  • runtime/pprof提供了低级api对程序性能数据采集
  • net/http/pprof中提供了直接通过http访问的方式
    • 向http包的默认请求路由器注册了多个服务端点和处理函数 image.png
  • 点击可以进行采集
  • 如果没有使用http的默认请求路由,需要在新的路由器上注册端点
  • 如果不是http程序,要单独启动一个用于性能数据采集的协程 总结:通过net/http/pprof包采集侵入小,代码独立,不用停止程序

1.1.3 数据分析

1.1.3.1 命令行交互
  • 生成采集文件
  • 使用go tool分析,可以看到运行时间和采集时间 image.png
  • 使用top查看 image.png
  • flat:函数代码在采用中的执行时长
  • sum%:当前函数与其调用函数的总计百分比
  • cum:当前函数与其等待的函数的总时长,所以越是调用栈底层的函数越大 可以通过list查看一个函数的各行执行时长 image.png 可以直接通过png命令生成png图 image.png
  • 可以看到叶子节点的cum值比较大
  • 也可以通过web命令用浏览器打开
1.1.3.2 web交互
go tool pprof -http=:9090 pprof_standalone1_cpu.prof

image.png

可以点击view查看各种形式

image.png

比如火焰图

image.png