官方pprof博客 - Profiling Go Pragrams。 真的好文,强烈推荐

对于性能分析及优化,不得不说 go 的工具链真的相当完善。

go tool pprofGoogle’s pprof C++ profiler 的轻微变体。最重要的命令是 topN,展示前N条的数据样本。

那么 pprof 要怎么使用,然后报告要怎么看呢?

怎么使用

有三种方式

http server 方式

推荐,且线上服务需要开启

package main  
  
import (  
   "net/http"  
 _ "net/http/pprof"  
)  
  
func main() {  
   go func() {  
      _ = http.ListenAndServe(":6060", nil)  
   }()  
   //do something  
}

可以直接使用 http://[ip]:6060/debug/pprof/ 访问

go test 指定方式

如上,go test 是单元测试时候指定 具体可以直接查看文档 go help testflag

显示指定方式

import (  
   "runtime/pprof"  
)  
  
func main() {  
    //写入到文件f
    pprof.StartCPUProfile(f)  
    defer pprof.StopCPUProfile()  
    //do something  
}

怎么分析

以推荐 http server 方式

准备数据

虽然 http://[ip]:6060/debug/pprof/ 可以以 web 方式查看数据,但不直观,是原始数据,不方便分析,只能看个大概统计数据比较有用些。

所以我们需要导出数据,并使用 go tool pprof xxx 方式分析。

直接推荐 go tool pprof -http=:8000 http://[ip]:6000/debug/pprof/xxxxxx:goroutine | heap | profile | mutex | trace 等,可以直接在 web 那边查看。

这种方式非常直观,而且还有火焰图(需要本地安装 graphviz)。

分析报告

go tool pprof -h 查看具体文档 非常重要的两个值:

  • flat: 当前位置自身消耗的值(不包含函数内的调用消耗)
  • cum(cumulative): 当前位置及子位置累计的消耗值(即当前函数以及所有调用的函数总消耗)

5个指标:

  • Flat:函数自身运行耗时
  • Flat%:函数自身耗时比例
  • Sum%:指的就是每一行的 flat% 与上面所有行的 flat% 总和
  • Cum:当前函数加上它所有调用栈的运行总耗时
  • Cum%:当前函数加上它所有调用栈的运行总耗时比例

清楚了这些指标后,分析就容易多了。

可视化分析

go tool pprof -http=:8000 http://[ip]:6000/debug/pprof/xxx , 访问 http://localhost:8000 即可。

在可视化界面中, 最显眼**(红色越深,字体越大,箭头越粗)**的就是问题节点了

命令行方式

go tool pprof http://[ip]:6000/debug/pprof/xxx

直接以命令行方式分析,比较重要的命令 top, top5 -cum, web, list xxx, help