1 简介

pprof 是用于可视化和分析性能分析数据的工具
pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)
profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式
常用的模式有:

  • Report generation:报告生成
  • Interactive terminal use:交互式终端使用
  • Web interface:Web 界面

在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。

  • runtime/pprof:采集程序(非 Server)的运行数据进行分析
  • net/http/pprof:采集 HTTP Server 的运行时数据进行分析

pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取每个函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

2 代码示例

  1. package main
  2. import (
  3. "math/rand"
  4. "os"
  5. "runtime/pprof"
  6. "time"
  7. )
  8. const (
  9. row = 6
  10. col = 5
  11. )
  12. func fillMatrix(m *[row][col]int) {
  13. s := rand.New(rand.NewSource(time.Now().UnixNano()))
  14. for i := 0; i < row; i++ {
  15. for j := 0; j < col; j++ {
  16. m[i][j] = s.Intn(100000)
  17. }
  18. }
  19. rand.Intn(32)
  20. }
  21. func calculate(m *[row][col]int) {
  22. for i := 0; i < row; i++ {
  23. tmp := 0
  24. for j := 0; j < col; j++ {
  25. tmp += m[i][j]
  26. }
  27. }
  28. }
  29. func main() {
  30. // 对CPU进行profile(性能分析)
  31. f1, err := os.Create("cpu.prof")
  32. if err != nil {
  33. return
  34. }
  35. err = pprof.StartCPUProfile(f1)
  36. if err != nil {
  37. return
  38. }
  39. defer pprof.StopCPUProfile()
  40. // 进行代码运算
  41. x := [row][col]int{}
  42. fillMatrix(&x)
  43. calculate(&x)
  44. time.Sleep(10 * time.Second)
  45. // 对堆进行profile(性能分析)
  46. f2, err2 := os.Create("mem.prof")
  47. if err2 != nil {
  48. return
  49. }
  50. err2 = pprof.WriteHeapProfile(f2)
  51. if err2 != nil {
  52. return
  53. }
  54. f2.Close()
  55. // 对go程进行profile(性能分析)
  56. f3, err3 := os.Create("goroutine.prof")
  57. if err3 != nil {
  58. return
  59. }
  60. gprof := pprof.Lookup("goroutine")
  61. if gprof == nil {
  62. return
  63. }
  64. gprof.WriteTo(f3, 0)
  65. f3.Close()
  66. }

image.png

3 分析prof文件

  1. go tool pprof cpu.prof

image.png
结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help 查看命令说明

  • flat:给定函数上运行耗时
  • flat%:同上的 CPU 运行耗时总比例
  • sum%:给定函数累积使用 CPU 总比例
  • cum:当前函数加上它之上的调用运行总耗时
  • cum%:同上的 CPU 运行耗时总比例