什么是 Profiling?

画像

在计算机性能调试领域里,profiling 就是对应用的画像,这里画像就是应用使用 CPU 和内存的情况。也就是说应用使用了多少 CPU 资源?都是哪些部分在使用?每个函数使用的比例是多少?有哪些函数在等待 CPU 资源?知道了这些,我们就能对应用进行规划,也能快速定位性能瓶颈。

golang 是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。

在 go 语言中,主要关注的应用运行情况主要包括以下几种:

  • CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据
  • Memory Profile(Heap Profile):报告程序的内存使用情况
  • Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈
  • Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的

两种收集方式

runtime/pprofnet/http/pprof

工具型应用

如果你的应用是一次性的,运行一段时间就结束。那么最好的办法,就是在应用退出的时候把 profiling 的报告保存到文件中,进行分析。对于这种情况,可以使用

pprofpprof.StartCPUProfile()w io.WriterStopCPUProfile()
main.go

应用执行结束后,就会生成一个文件,保存了我们的 CPU profiling 数据。

WriteHeapProfilestartstop

服务型应用

net/http/pprof
http.DefaultServeMuxhttp.ListenAndServe("0.0.0.0:8000", nil)
Mux
/debug/pprof

这个路径下还有几个子页面:

/debug/pprof/profile/debug/pprof/heap/debug/pprof/block/debug/pprof/goroutines

go tool pprof 命令:获取和分析 Profiling 数据

go tool pprof
graphviz

NOTE:获取的 Profiling 数据是动态的,要想获得有效的数据,请保证应用处于较大的负载(比如正在生成中运行的服务,或者通过其他工具模拟访问压力)。否则如果应用处于空闲状态,得到的结果可能没有任何意义。

CPU Profiling

go tool pprofgo tool pprof [binary] [source]binarysource
?seconds=60help
topN
累加值 cumulative
toplistdisasm
webwebsvg



这个调用图包含了更多的信息,而且可视化的图像能让我们更清楚地理解整个应用程序的全貌。图中每个方框对应一个函数,方框越大代表执行的时间越久(包括它调用的子函数执行时间,但并不是正比的关系);方框之间的箭头代表着调用关系,箭头上的数字代表被调用函数的执行时间。

encoding/json.(*decodeState).object
pproflist
disadm weblist
pprof --help

Memory Profiling

/debug/pprof/profile/debug/pprof/heap
top N

每一列的含义也是类似的,只不过从 CPU 使用时间变成了内存使用大小,就不多解释了。

websvg
--inuse_objects--alloc-space

这里还要提两个比较有用的方法,如果应用比较复杂,生成的调用图特别大,看起来很乱,有两个办法可以优化:

web funcNamego tool pprof--nodefration=0.05

go-torch 和火焰图

火焰图(Flame Graph)是 Bredan Gregg 创建的一种性能分析图表,因为它的样子近似 而得名。上面的 profiling 结果也转换成火焰图,如果对火焰图比较了解可以手动来操作,不过这里我们要介绍一个工具:go-torch。这是 uber 开源的一个工具,可以直接读取 golang profiling 数据,并生成一个火焰图的 svg 文件。



火焰图 svg 文件可以通过浏览器打开,它对于调用图的最优点是它是动态的:可以通过点击每个方块来 zoom in 分析它上面的内容。

火焰图的调用顺序从下到上,每个方块代表一个函数,它上面一层表示这个函数会调用哪些函数,方块的大小代表了占用 CPU 使用的长短。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。

http://localhost:8080/debug/pprof/profile
-u --url-s --suffix/debug/pprof/profile--seconds
$PATH

和测试工具的集成

go test 命令有两个参数和 pprof 相关,它们分别指定生成的 CPU 和 Memory profiling 保存的文件:

-cpuprofile-memprofile
cpu.prof
main.testcpu.profgo tool pprofmain.test

需要注意的是,Profiling 一般和性能测试一起使用,这个原因在前文也提到过,只有应用在负载高的情况下 Profiling 才有意义。

参考资料

转载: