Go语言之火焰图

Flame Graph

Posted by alovn on July 19, 2021

火焰图是将采集到的性能数据生成的图表,使数据显得更直观

火焰图中垂直的数轴即 y 轴,表示调用栈的深度。顶部是正在执行的函数,下方都是它的父函数,在 y 轴上的高度越高,表面调用的层次越深。

火焰图中水平的数轴即 x 轴,表示请求占用CPU资源的情况,在 x 轴上的宽度越宽,则表示请求的次数越多,占用耗时也就越长。

如果最上面是“平顶”的样子,则可能存在性能问题,存在优化空间,正常的火焰图呈现的效果应该有很多尖刺,而不应该是“平顶”。

pprof

Go语言中可以使用pprof工具查看火焰图,需要安装依赖工具 graphviz (brew install graphviz / yum install graphviz)。

1
2
3
4
5
import "net/http"
import _ "net/http/pprof"
func main() {
    http.ListenAndServe("0.0.0.0:8080", nil)
}

执行 go run main.go,通过访问 http://127.0.0.1:8080/debug/pprof/ 可以查看运行时的数据。然后执行:

1
go tool pprof -http=:1234 http://localhost:8080/debug/pprof/profile

然后可以通过访问浏览器 http://localhost:1234/ui/flamegraph 查看到火焰图。